新的编辑可以改进和集中我对特定查询的回答
为了确保内存中的数据对齐,C 中有特定的函数来强制执行此操作(假设您的数据是兼容的 - 您的数据匹配或离散地符合您所需的对齐方式)
要使用的函数是[_aligned_malloc][1],而不是原版的malloc。
// Using _aligned_malloc
// Note alignment should be 2^N where N is any positive int.
int alignment = 16;
ptr = _aligned_malloc('required_size', alignment);
if (ptr == NULL)
{
printf_s( "Error allocation aligned memory.");
return -1;
}
这将(如果成功)强制您的数据在 16 字节边界上对齐,并且应该满足 SSE 的要求。
我对结构成员对齐问题的看法较旧的答案很重要 - 但不是直接回答查询
为确保结构成员字节对齐,您可以注意如何在结构中排列成员(最大在前),或者您可以(在某种程度上)在编译器设置、成员属性或结构属性中进行设置。
假设 32 位机器,4 字节整数:这仍然是 4 字节对齐在内存中(第一个最大的成员是 4 字节),但填充为 16 字节大小。
struct s_Stuff {
int var1; /* 4 bytes */
short var2; /* 2 bytes */
char padding[10]; /* ensure totals struct size is 16 */
}
编译器通常会填充每个 成员 以帮助自然对齐,但填充也可能位于结构的末尾。这是结构成员数据对齐。
较旧的编译器结构成员对齐设置可能类似于下面这两张图片...但这与 数据对齐 不同,后者涉及内存分配和数据存储。
当 Borland 使用短语(来自图像)数据对齐,而 MS 使用 Struct 成员对齐时,这让我感到困惑。 (虽然它们都专门指结构成员对齐)
为了最大限度地提高效率,您需要为您的硬件(或本例中的向量处理)编写代码,因此假设 32 位、4 字节整数等。然后您想使用紧凑结构来节省空间,但填充结构可能提高速度。
struct s_Stuff {
float f1; /* 4 bytes */
float f2; /* 4 bytes */
float f3; /* 4 bytes */
short var2; /* 2 bytes */
}
这个结构可以被填充以将结构成员对齐为 4 字节的倍数....除非您指定它保持单字节结构成员对齐,否则编译器将执行此操作em> - 所以 FILE 的大小可能是 14 字节,但在 MEMORY 中,这个结构的数组仍然是 16 字节(浪费了 2 字节),数据对齐未知(malloc 默认可能是 8 字节)但不能保证。如上所述,您可以在某些平台上使用_aligned_malloc 强制内存中的数据对齐)
同样关于结构中的member alignment,编译器将使用最大成员的倍数来设置对齐方式。或者更具体地说:
结构总是与最大类型的对齐方式对齐
要求
...来自here
如果您使用的是 UNION,那么您是正确的,它被强制为最大可能的结构,请参阅here
检查您的编译器设置是否也与您想要的结构成员对齐/填充相矛盾,否则您的结构的大小可能与您期望的不同。
现在,为什么它更快?请参阅here,它解释了对齐如何允许硬件传输离散的数据块并最大限度地利用传递数据的硬件。也就是说,数据不需要在每个阶段都被拆分或重新排列——通过硬件处理
通常,最好将您的编译器设置为与您的硬件(和平台操作系统)产生共鸣,以便您的对齐(和填充)最适合您的硬件处理能力。 32 位机器通常最好使用 4 字节(32 位)成员对齐方式,但随后以 4 字节成员对齐方式写入文件的数据可能会占用比预期更多的空间。
特别是关于 SSE 向量,正如 link 所述,4 * 4 字节是确保 16 字节对齐的最佳方式,也许像这样。 (他们在这里指的是数据对齐)
struct s_data {
float array[4];
}
或只是floats 或doubles 的数组。