优化内联值

时间:2013-09-19 11:11:02

标签: c++ visual-c++ optimization gcc inline

我有以下内联方法,并在其他方法中多次调用它。具有O2优化的vc和gcc编译器是否能够注意到调用方法中的值是固定的并且只评估一次? - 确实indexAndFlag在这些方法中没有改变。 - 或者,也许对于线程安全性,它将根据每个呼叫进行评估?

unsigned int indexAndFlag;
...

inline Index* index() const
{
    return (Index*)(indexAndFlag & ~1);
}

代码仅适用于受保护模式x86 32/64位架构,所以我希望,我可以假设sizeof(unsigned int) == sizeof(Index*)。如果没有,请纠正我。

2 个答案:

答案 0 :(得分:3)

如果看起来像indexAndFlag是非const非静态全局,那么没有。编译器无法确定另一个翻译单元是否可以修改它,因此程序必须在其使用的任何地方访问其值。

如果是const,并使用常量表达式初始化,则编译器必须将其视为常量值,并且表达式 也应视为常量值。< / p>

  

我希望,我可以假设sizeof(unsigned int) == sizeof(Index*)

我不愿意:许多流行的64位架构都有32位int。使用uintptr_t来确定。

答案 1 :(得分:2)

从底部开始:64位的sizeof(unsigned int) != sizeof(Index *),这是肯定的。如果你正在做这个假设,我肯定会建议你在代码中的某处使用static_assert(sizeof(unsigned int) == sizeof(Index *))

接下来,编译器对全局变量和优化做了什么或不做什么绝对是“直到编译器”的情况。编译器可能决定每次重新加载值,或者它可能决定“啊,我知道这不会改变”。这实际上取决于它“理解”indexAndFlag没有改变的程度。

我个人会使用类似的东西:

 Index* temp = index();

  ... 
   use temp
  ...

然后保证不会进行额外的操作来“计算”索引。