我收到这个警告。我想要定义的行为,但我想保持此代码不变。我什么时候可以打破别名规则?
警告:取消引用类型双关指针将破坏严格别名规则 [-Wstrict-aliasing]
字符串是我自己的字符串,它是一个 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
}
}