其他分享
首页 > 其他分享> > c – 非平凡可复制类型的值表示

c – 非平凡可复制类型的值表示

作者:互联网

我对标准中的以下段落感兴趣(ISO / IEC 14882:2011(E)的§3.9/ 4):

The object representation of an object of type T is the sequence of N unsigned char objects taken up by the object of type T, where N equals sizeof(T). The value representation of an object is the set of bits that hold the value of type T. For trivially copyable types, the value representation is a set of bits in the object representation that determines a value, which is one discrete element of an implementation-defined set of values.42

我理解对象表示和值表示是不同的,以允许一些对象表示不参与对象的值(例如,填充).虽然我不太了解关于可复制类型的观点.非平凡的可复制类型没有值吗?非平凡可复制类型的部分值表示是否存在于其对象表示之外?

注42解释:

The intent is that the memory model of C++ is compatible with that of ISO/IEC 9899 Programming Language C.

我仍然不明白为什么之前的声明仅适用于简单的可复制类型.这有什么意义?

解决方法:

标准示例是管理资源的类:

struct Foo
{
    Bar * p;

    Foo() : p(new Bar) { }
    ~Foo() { delete p; }

    // copy, assign
};

类型为Foo的对象具有值,但该值不能通过复制对象表示来复制(在这种情况下,这只是p的值).复制类型为Foo的对象需要复制类的语义,即“一个对象拥有指针对象”.因此,合适的副本需要适当的,用户定义的复制构造函数:

Foo::Foo(Foo const & rhs) : p(new Bar(*rhs.p)) { }

现在,类型为Foo的对象的对象表示与此类对象的副本的对象表示不同,尽管它们具有相同的值.

相反,只要对象表示重合,int的值就与另一个int的值相同. (由于填充,这是一个充分但不必要的条件.)

标签:memory-model,c,object
来源: https://codeday.me/bug/20191008/1870618.html