是否复制了POD类型的填充字节?

Sza*_*lcs 47 c++ copy-constructor

假设我有这样的POD类型:

struct A {
    char a;
    int b;
};
Run Code Online (Sandbox Code Playgroud)

在我的系统上,sizeof(A) == 8即使sizeof(char) == 1sizeof(b) == 4.这意味着数据结构有3个未使用的字节.

现在假设我们这样做

A x = ...;
A y =x;
Run Code Online (Sandbox Code Playgroud)

题:

难道是保证所有8个字节的xy将是相同的,即使是那些3分未使用的?

同样,如果我将某些A对象的底层字节转移到另一个不理解其含义或结构的程序,并将它们视为一个8字节的数组,那么其他程序可以安全地比较两个As的相等吗?

注意:在使用gcc 7的实验中,似乎会复制这些字节.我想知道这是否有保证.

Bau*_*gen 43

非联合类X的隐式定义的复制/移动构造函数执行其基础和成员的成员复制/移动.

12.8/15 [class.copy]在N4141中

因此允许填充字节中的位模式不同.

  • "实际上,N4141的源代码可以在github上找到,你只需要自己构建它"这是一个非常C++的话. (4认同)
  • @StefanHanke实际上,N4141的源代码可以在github上找到,你只需要自己构建它.https://github.com/cplusplus/draft/tree/n4141 (3认同)

Tri*_*dle 7

它不是权威的,但是cppreference条目std::memcmp建议填充字节可能不同:

memcmp()类型的两个对象之间struct{char c; int n;}将比较填充字节,其值时的值可能不同c,并n是相同的

  • Not sure what this has to do with copying? (11认同)

Mas*_*nes 6

鉴于您询问了POD类型(因此包括工会),值得一提的是,根据[class.copy]

联合X的隐式定义的复制/移动构造函数复制X的对象表示(6.9)

对于简单的可复制类型,也应该包括填充位.所以,这可能只是用A替换A的问题

union A{ struct {
    char a;
    int b;
}; };
Run Code Online (Sandbox Code Playgroud)

(实际上,上面使用的是非标准的匿名结构,但是你明白了......)