gpt4 book ai didi

c - 数据在 C union 中的位置是否有任何标准?

转载 作者:太空宇宙 更新时间:2023-11-04 01:02:50 25 4
gpt4 key购买 nike

我有以下 union :

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

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

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

最佳答案

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

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

因此,要从十个 union 问题 的数组中复制十个 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;

关于c - 数据在 C union 中的位置是否有任何标准?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31822767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com