优化程序是否可以在命名空间中声明变量

时间:2015-09-29 00:04:06

标签: c++

我正在查看一些遗留代码,它执行的操作类似于以下内容:

namespace MyNamespace
{
   const bool myVariable = f::y();
}

其中f :: y()具有在单独拥有的地图中注册某些内容的副作用。

我的问题是,如果不直接访问MyNamespace :: myVariable,标准是否允许优化器完全消除它?这必须是链接时间优化(我认为),我不确定该标准对此类事情的评价程度。我自己找不到合适的参考资料了。

编译器目前是符合C ++ 03的编译器,但很快就会迁移到C ++ 14编译器。

1 个答案:

答案 0 :(得分:1)

如果f::y()具有可观察到的副作用,则不允许编译器优化该调用。我知道的唯一实例,实际上允许编译器进行优化以改变程序的行为是在复制对象时(copy-elision)。

但是如果在你的翻译单元中没有访问myVariable *)(由jonathan解释),那么编译器实际上不必为变量保留任何空间。

简而言之:它可以优化掉变量,但很可能不是函数调用。

*)我认为要查找的术语是ODR-Used