我有以下联盟:
union problem {
int i;
int *v;
};
在我的系统上,int
是4个字节,而int*
是8.我有一个数组,其中有10个这样的结构。在代码的某一部分,我碰巧知道数组的所有成员都在使用union的int
。我需要将这些int复制到一个int数组中。现在,如果源数组是一个int数组,我可以使用memcpy
来快速复制数据。
是否可以保证int存储在联合的低内存或高内存中?我希望能够在不进行迭代的情况下复制数据,因此我在考虑使用SIMD和shuffle进行循环。要做到这一点,我必须知道int实际上在union中的位置,我猜这是特定于实现的。
答案 0 :(得分:5)
union的两个元素都以其第一个字节存储在union的起始地址。在您的示例中,int
和int *
都存储在同一地址。这始终是有保障的。
未定义的是int
是否存储在int *
的不太重要或更重要的字节上。请注意,如果您有一个联合数组,将元素批量复制到int
数组中会将不确定的值复制到目标数组的每个替换成员中(实际上,它可能是严格未定义的行为)理论)。
因此,要复制十个int
数组中的十个union problem
值,您需要迭代数组的元素,复制.i
成员转动。
union problem p[10] = { … };
int copy[10];
或者:
for (int i = 0; i < 10; i++)
copy[i] = p[i].i;
或者:
int *cp = copy;
union problem *pp = p;
int *end = copy + 10;
while (cp < end)
*cp++ = (*pp++).i;