根据 C++11 标准部分草案,这似乎不是有效的优化14.8
[温度.fct.规格] says (强调我的前进):
每个函数模板专门化都是从模板实例化的有
任何静态变量的自己的副本。 [ 例子:
template<class T> void f(T* p) {
static T s;
};
void g(int a, char* b) {
f(&a); // calls f<int>(int*)
f(&b); // calls f<char*>(char**)
}
这里 f(int*) 有一个 int 类型的静态变量 s 和
f(char**) 有一个 char* 类型的静态变量 s。 —结束示例]
由于您获取了变量的地址,因此折叠它们会影响可观察到的行为,这将违反假设规则 http://en.cppreference.com/w/cpp/language/as_if.
T.C.指出/opt:noicf
防止不合格行为。
马特·麦克纳布指出/OPT(优化)文档 https://msdn.microsoft.com/en-us/library/bxwfs976.aspx包含以下注释:
因为 /OPT:ICF 会导致相同的地址被分配给
不同的函数或只读数据成员(const 变量
使用 /Gy 编译),它可以破坏依赖于唯一的程序
函数或只读数据成员的地址。了解更多
信息,请参阅 /Gy(启用功能级链接)。
这表明这可能是故意的不合格行为。本·沃伊特在评论中说现在转移到聊天 https://chat.stackoverflow.com/rooms/73053/discussion-on-answer-by-shafik-yaghmour-is-visual-studio-2013-optimizing-correct这确实意味着可以进行优化不合格但这一点是值得商榷的。
用户usrlinked https://stackoverflow.com/questions/29056890/is-visual-studio-2013-optimizing-correctly-in-the-presence-of-opticf#comment46359307_29056890 to an MS 博客文章:“/Gw”编译器开关简介 http://blogs.msdn.com/b/vcblog/archive/2013/09/11/introducing-gw-compiler-switch.aspx它说:
请注意,ICF 优化仅适用于相同的情况
地址未被占用的 COMDAT,并且它们是只读的。如果一个
数据未取地址,则 ICF 破坏地址唯一性
不会导致任何可观察到的差异,因此它是有效的并且
符合标准。
后来的评论说:
即使它本身就是完全标准的抱怨,当
与 /Gy 结合可能会导致潜在的破坏行为。
据我所知,为了/Gy
影响const变量__declspec(选择)必须使用,但在文档中可能会更清楚。
至少我们可以看到/Gw
不应引入不合格行为,但/Gy
结合/Gw
may.