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

use*_*469 1 c arrays simd unions

我有以下联盟:

union problem {
    int i;
    int *v;
};
Run Code Online (Sandbox Code Playgroud)

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

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

Jon*_*ler 5

union的两个元素都以其第一个字节存储在union的起始地址.在你的榜样,两者intint *都开始存储在同一地址.这始终是有保证的.

没有定义的是是否int存储在不太重要或更重要的字节上int *.请注意,如果你有一个联合数组,那么将元素批量复制到一个数组中int会将不确定的值复制到目标数组的每个替换成员中(实际上,理论上它可能是严格的未定义行为).

因此,int要从十个数组中复制十个值union problem,您需要迭代数组的元素,.i依次复制成员.

union problem p[10] = { … };
int copy[10];
Run Code Online (Sandbox Code Playgroud)

或者:

for (int i = 0; i < 10; i++)
    copy[i] = p[i].i;
Run Code Online (Sandbox Code Playgroud)

要么:

int *cp = copy;
union problem *pp = p;
int *end = copy + 10;
while (cp < end)
    *cp++ = (*pp++).i;
Run Code Online (Sandbox Code Playgroud)