【发布时间】:2018-04-03 03:44:06
【问题描述】:
假设我有一个像这样的 POD 类型:
struct A {
char a;
int b;
};
在我的系统上,sizeof(A) == 8,即使 sizeof(char) == 1 和 sizeof(b) == 4。这意味着数据结构有 3 个未使用的字节。
现在假设我们这样做
A x = ...;
A y =x;
问题:
是否保证 x 和 y 的所有 8 个字节都相同,即使是未使用的 3 个?
同样,如果我将一些 A 对象的底层字节传输到另一个不理解它们的含义或结构的程序,并将它们视为一个 8 字节的数组,那么其他程序可以安全地比较两个 As为了平等?
注意:In an experiment with gcc 7,这些字节似乎确实被复制了。我想知道这是否得到保证。
【问题讨论】:
-
我不认为骗子回答了“填充字节是否相同”的问题。它只是说 memcpy 复制它们,但这并不是 OP 所要求的。
-
@vsoftco "
=只需要复制成员。它可能会也可能不会复制填充。" 最佳答案中的第二段。 -
不保证赋值或初始化会复制填充。在某些情况下,不复制它可能很重要(填充可以在继承中重用)。
memcpy会复制它,因为它不知道。 -
如果您还需要复制填充字节,您可以使用
memcpy()来完成。我有时在 C 中使用的另一种技术是使用memset()将结构的所有字节设置为 0,然后 然后 进行成员复制。十多年来,现代编译器已经能够优化冗余双写。
标签: c++ copy-constructor