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

Is there any standard for where data is located in a C union?

我有以下联盟:

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

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

是否可以保证int存储在union的低位内存或高端内存中?我希望能够在不迭代的情况下复制数据,所以我正在考虑使用 SIMD 和随机播放循环。为此,我必须知道 int 实际上在联合中的位置,我猜这是特定于实现的。

联合的两个元素的第一个字节都存储在联合的起始地址。在您的示例中, intint * 都存储在同一地址。这总是有保证的。

没有定义的是 int 是否存储在 int * 的低位字节或高位字节上。请注意,如果您有联合数组,将元素批量复制到 int 数组中会将不确定的值复制到目标数组的每个备用成员中(实际上;理论上它可能是严格未定义的行为)。

因此,要从包含十个 union problem 的数组中复制十个 int 值,您需要遍历数组的元素,将 .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;