数据在C联合中的位置是否有任何标准?

时间:2015-08-05 03:07:53

标签: c arrays simd unions

我有以下联盟:

union problem {
    int i;
    int *v;
};

在我的系统上,int是4个字节,而int*是8.我有一个数组,其中有10个这样的结构。在代码的某一部分,我碰巧知道数组的所有成员都在使用union的int。我需要将这些int复制到一个int数组中。现在,如果源数组是一个int数组,我可以使用memcpy来快速复制数据。

是否可以保证int存储在联合的低内存或高内存中?我希望能够在不进行迭代的情况下复制数据,因此我在考虑使用SIMD和shuffle进行循环。要做到这一点,我必须知道int实际上在union中的位置,我猜这是特定于实现的。

1 个答案:

答案 0 :(得分:5)

union的两个元素都以其第一个字节存储在union的起始地址。在您的示例中,intint *都存储在同一地址。这始终是有保障的。

未定义的是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;