我收到此警告。我想要定义的行为,但我想保持这段代码不变。我什么时候可以违反别名规则?
warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
String 是我自己的字符串,它是一个 POD。此代码是从 C 调用的。 S 可能是一个 int。 String 几乎就是 struct String { RealString*s; }
但模板化和辅助函数。我做了一个静态断言来确保 String 是一个 pod,是 4bytes 和 int 是 4bytes。我还写了一个断言,它检查所有指针是否 >= NotAPtr。它在我的新/malloc 重载中。如果您建议,我也可以将该断言放入字符串中
考虑到我遵循的规则(主要是字符串是一个 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
}
}
最佳答案
memcpy
得到完全支持。对 char*
进行双关也是如此(例如,您随后可以使用 std::copy
)。
关于c++ - 我什么时候可以打破别名规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9776363/