c++ - 使用指针转换来存储/转换值 : Am I breaking the strict aliasing rule?

标签 c++ pointers c++98 strict-aliasing

问题涉及 this post .

一些权威用户表示以下代码中断strict aliasing rules .

#include <boost/static_assert.hpp>

template <typename T>
struct MyType {

    private:
    T data;

    public:
    template <typename U>
    operator U () {
        BOOST_STATIC_ASSERT_MSG(sizeof(U) == sizeof(T),"Trying to convert to data type of different size");
        return *((U*) &data);
    }

    template <typename U>
    NeonVectorType<T>& operator =(const U& in) {
        BOOST_STATIC_ASSERT_MSG(sizeof(U) == sizeof(T),"Trying to copy from data type of different size");
        data = *((T*) &in);
        return *this;
    }
}

但是,我从不使用指向写入数据的指针,而且我从不共享指向它的指针,所以我看不到变量中包含的值如何在编译器没有意识到这一点的情况下发生变化正在发生。我的印象是,也许我违反了一些规则,但不是严格的别名......

注意:我不知道这有多重要,但我的编译器 (gcc 4.9) 不会发出警告。

最佳答案

*((U*) &data) 将违反严格别名,如果这是一个 reinterpret_cast 并且类型 U 不允许别名T 类型。允许的类型出现在 this list 中.

规则引用both reading and writing .

Here是一篇很好的文章,解释了规则背后的一些基本原理。

如主要严格别名线程中所述,您可以使用 memcpy 作为解决方法,例如:

U u;
memcpy( &u, &data, sizeof u );
return u;

在另一个函数中

memcpy( &data, &in, sizeof data );

请注意,类类型的原始字节拷贝受到一些限制(我认为类必须是 POD,并且您最好确保它们具有相同的布局)。

关于c++ - 使用指针转换来存储/转换值 : Am I breaking the strict aliasing rule?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29253100/

相关文章:

c++ - Boost MPL 占位符和 Lambda

Java:可调整大小的数组列表不会保持平行

c++ - 用 C++11 编译比用 C++98 慢吗?

c++ - 自动迭代器引用的 C++98 等价物是什么?

c++ - pbs_server、E5-2620v4 和一般保护

c++ - 问题编译 C++ 源

c - 我不明白这段代码的数组和指针

c++ - 段错误(核心转储)- 具有多维 vector 的循环 C++98

c++ - 我究竟应该如何为数组实现随机数或随机数算法以随机顺序显示引号?

c - *ptr[10] 和 (*ptr)[10] 的区别