首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用指针转换来存储/转换值:我是否违反了严格的混叠规则?

使用指针转换来存储/转换值:我是否违反了严格的混叠规则?
EN

Stack Overflow用户
提问于 2015-03-25 10:28:15
回答 2查看 130关注 0票数 3

这个问题与这个职位有关。

一些权威用户表示,以下代码破坏了严格混叠规则

代码语言:javascript
复制
#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)不会发出警告。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-25 10:34:21

如果这是一个*((U*) &data),并且不允许类型U别名类型T,那么U将违反严格的别名。允许的类型出现在这份清单中。

该规则指的是读写兼备

这里是一篇很好的文章,它解释了规则背后的一些原理。

正如在主严格混叠线程上所指出的,您可以使用memcpy作为工作对象,例如:

代码语言:javascript
复制
U u;
memcpy( &u, &data, sizeof u );
return u;

在另一个功能中

代码语言:javascript
复制
memcpy( &data, &in, sizeof data );

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

票数 2
EN

Stack Overflow用户

发布于 2015-03-25 10:50:12

但是,我从不用指针来写数据.

标准中的语言比这更通用;basic.life/7有:

..。指向原始对象、引用原始对象或原始对象名称的指针.

在您的operator=中,您使用的是T类型的lvalue来写入data,在operator U中,您使用的是一个U类型的指针来读取它;如果UT是无关的,而不是字符类型,则这是UB。

只需使用memcpy。它保证工作,它是有效的(尝试一下)!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29253100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档