注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

路雷米的博客

人生最难的就是在热爱和生计之间做选择, 愿每个人这一生 既对得起梦想又担得责任

 
 
 

日志

 
 

C99中的一个例子分析  

2016-09-18 13:04:53|  分类: C语言知识 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

struct t1 { int m; };
struct t2 { int m; };
int f(struct t1 * p1, struct t2 * p2)
{
    if (p1->m < 0)
    p2->m = -p2->m;
    return p1->m;
}


int g()
{
    union {
        struct t1 s1;
        struct t2 s2;
    } u;
    /* ... */
    return f(&u.s1, &u.s2);
}

 

对于 int f(struct t1 *p1, struct t2 *p2) 这样声明的函数, C 的别名规则(Aliasing Rule)允许编译器作这样的假设前提:p1 和 p2 不指向同一对象,或者指向的对象不存在重叠。根据这个假设前提,编译器可以对函数代码进行优化(比如把 p2 指向的对象放到寄存器中)。在此情况下,f(&u.s1, &u.s2) 函数调用中两个参数指针由于实际指向同一对象,其结果有可能是不正确的。

如果在函数范围内 union u 的定义可见,则编译器可根据关于 union 的这一特殊保证(5 One special guarantee..)判断出有可能函数参数 p1 和 p2 指向同一对象 union u 的成员,从而不会对函数进行上面提到的优化,以保证函数的结果正确

  评论这张
 
阅读(56)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018