c++ - 我什么时候可以打破别名规则?

标签 c++ strict-aliasing type-punning

我收到此警告。我想要定义的行为,但我想保持这段代码不变。我什么时候可以违反别名规则?

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/

相关文章:

c++ - g++ 的严格别名警告准确性

c++ - 这个 union 会打破严格的别名吗?浮点寄存器呢

c++ - 非多态类型上的 C 风格转换

c++ - 使用智能指针建模所有权的含义

c++ - 初始化列表和 const& - 这是合法的 C++

c - char[] + memcpy() 是否违反严格别名?

c++ - STM32 SPI 硬件和严格的别名警告

c++ - 可以使用 union 将 char 数组转换为 float 吗?

c++ - OpenAL 中播放缓冲区之间的静音?

c++ - 使用 VS 公共(public)继承进行模板化