数据在 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 实际上在联合中的位置,我猜这是特定于实现的。
联合的两个元素的第一个字节都存储在联合的起始地址。在您的示例中, int
和 int *
都存储在同一地址。这总是有保证的。
没有定义的是 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;
我有以下联盟:
union problem {
int i;
int *v;
};
在我的系统上,int
是 4 个字节,而 int*
是 8 个字节。我有一个包含 10 个这样的结构的数组。在某段代码中,我碰巧知道数组的所有成员都在使用联合的int
。我需要将这些整数复制到一个整数数组中。现在,如果源数组是一个 int 数组,我可以使用 memcpy
来快速复制数据。
是否可以保证int存储在union的低位内存或高端内存中?我希望能够在不迭代的情况下复制数据,所以我正在考虑使用 SIMD 和随机播放循环。为此,我必须知道 int 实际上在联合中的位置,我猜这是特定于实现的。
联合的两个元素的第一个字节都存储在联合的起始地址。在您的示例中, int
和 int *
都存储在同一地址。这总是有保证的。
没有定义的是 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;