【发布时间】:2015-05-17 09:22:27
【问题描述】:
我希望以下程序始终返回 0。但是,对于 Visual Studio 2013(更新 4),程序在发布版本中退出 1。我不确定这是否是一个错误,或者编译器的优化器是否正确并且依赖于某些边缘行为。如果关闭了 CONST 宏,则 release exe 返回 0。如果优化器确实正确,我能得到允许它发出代码的原因吗?
#if 1
# define CONST const
#else
# define CONST
#endif
class TypeId {
public:
bool operator== (TypeId const & other) const
{
return id == other.id;
}
private:
TypeId (void const * id)
: id(id)
{}
public:
template <typename T>
static TypeId Get ()
{
static char CONST uniqueMemLoc = 0;
return TypeId(&uniqueMemLoc);
}
private:
void const * id;
};
int main(int, char **)
{
typedef int A;
typedef unsigned int B;
if (TypeId::Get<A>() == TypeId::Get<B>()) {
return 1;
}
return 0;
}
【问题讨论】:
-
我认为优化器不正确。
-
可能与 MSVC 中的 COMDAT 折叠有关。
-
是的,
/opt:noicf修复了它。 -
@ShafikYaghmour MSDN documentation 似乎暗示这是故意的:“因为 /OPT:ICF 可能导致将相同的地址分配给不同的函数或只读数据成员(由使用 /Gy),它可以破坏依赖于函数或只读数据成员的唯一地址的程序。有关详细信息,请参阅 /Gy(启用函数级链接)。"
-
@usr 等一下,我刚刚完整阅读了这篇文章,上面写着
Please note, the ICF optimization will only be applied for identical COMDATs where their address is not taken,这表明它不适用于这种情况。
标签: c++ c++11 visual-studio-2013 optimization