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中的位置,我猜这是特定于实现的.
union的两个元素都以其第一个字节存储在union的起始地址.在你的榜样,两者int并int *都开始存储在同一地址.这始终是有保证的.
没有定义的是是否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)
| 归档时间: |
|
| 查看次数: |
64 次 |
| 最近记录: |