【发布时间】:2012-04-04 07:17:39
【问题描述】:
我收到此警告。我想要定义的行为,但我想保持此代码不变。我什么时候可以打破别名规则?
警告:取消引用类型双关指针将破坏严格别名规则 [-Wstrict-aliasing]
String 是我自己的字符串,它是一个 POD。这段代码是从 C 调用的。S 可能是一个 int。字符串几乎是struct String { RealString*s; },但是模板化和辅助函数。我做了一个静态断言来确保 String 是一个 pod,是 4bytes 并且 int 是 4bytes。我还写了一个断言来检查所有指针是否>= NotAPtr。它在我的 new/malloc 重载中。如果您建议,我也可以将该断言放入 String 中
考虑到我遵循的规则(主要是字符串是一个 pod,并且总是与 int 大小相同),如果我打破别名规则会很好吗?这是少数几次打破它的情况之一吗?
void func(String s) {
auto v=*(unsigned int*)&s;
myassert(v);
if(v < NotAPtr) {
//v is an int
}
else{
//v is a ptr
}
}
【问题讨论】:
-
“我能开多快而不拿到超速罚单?”微软对
MAKEINTRESOURCE做了类似的事情,但他们也编写了编译器并且可以添加扩展。普通人做不到。在 C++ 中,他们可以添加一个重载。 -
你在滑坡上。你真的有充分的理由不制作单独的 func_i 和 func_s 函数吗?
-
@PerJohansson:我在项目开始时做过。现在这个理由已经不存在了。所以我做了2个函数。 +1
-
“破坏别名规则”永远不会“很好”,因为它是 UB,它为编译器提供了一张免费票,可以删除或呈现无法识别的整个程序。我们是否可以看到它并说“是的,这将在 99% 的带有非反复无常编译器的平台上工作”并不重要;标准不要求存在这样的编译器。
标签: c++ strict-aliasing type-punning