我正在查看一些遗留代码,它执行的操作类似于以下内容:
namespace MyNamespace
{
const bool myVariable = f::y();
}
其中f :: y()具有在单独拥有的地图中注册某些内容的副作用。
我的问题是,如果不直接访问MyNamespace :: myVariable,标准是否允许优化器完全消除它?这必须是链接时间优化(我认为),我不确定该标准对此类事情的评价程度。我自己找不到合适的参考资料了。
编译器目前是符合C ++ 03的编译器,但很快就会迁移到C ++ 14编译器。
答案 0 :(得分:1)
如果f::y()
具有可观察到的副作用,则不允许编译器优化该调用。我知道的唯一实例,实际上允许编译器进行优化以改变程序的行为是在复制对象时(copy-elision)。
但是如果在你的翻译单元中没有访问myVariable
*)(由jonathan解释),那么编译器实际上不必为变量保留任何空间。
简而言之:它可以优化掉变量,但很可能不是函数调用。
*)我认为要查找的术语是ODR-Used