【发布时间】:2015-07-29 21:10:09
【问题描述】:
考虑下面的两个structs:
struct A {
double x[3];
double y[3];
int z[3];
struct A *a;
int b;
struct A *c;
unsigned d[10];
};
struct B {
double x[3];
double y[3];
int z[3];
};
注意struct B 是struct A 的严格子集。现在,我想将成员.x、.y 和.z 从struct A 的实例复制到struct B 的实例。我的问题是:根据标准,这样做是否有效:
struct A s_a = ...;
struct B s_b;
memcpy(&s_b, &s_a, sizeof s_b);
即是否保证成员的填充,在他们出现的顺序中,将是相同的,这样我就可以“部分地”memcpystruct A 到struct B?
【问题讨论】:
-
一点也不。我相信有人会找到标准,但填充取决于实现,除非代码中有非常具体的标志。
-
如前所述,填充将成为方式和实现依赖。你试过你的系统吗?计算机很有趣,因为当您尝试时没有任何问题
-
我认为可能要求
B是A的严格前缀,而不仅仅是一个子集。 -
@Pynchia 这只会告诉你它是否适用于特定情况,而不是泛化。
-
@Jashaszun 虽然填充依赖于实现,但我认为实现必须保持一致。