Boost aligned_allocator 的对齐参数是什么意思?

What does the alignment parameter for Boost aligned_allocator mean?

有一个 Boost 教程给出了大约以下代码,针对我的问题稍作修改:

#include <boost/align/aligned_allocator.hpp>
#include <vector>
int main()
{
  std::vector<int, boost::alignment::
    aligned_allocator<int, 16> > v(100);
}

在本例中,给定的对齐参数为 16。这是表示 16 字节对齐,还是 16*sizeof(int) 字节对齐?

数字16指的是字节数。来自 Boost.Align documentation(使用与 C++ 标准相同的术语)

[basic.align]

Object types have alignment requirements which place restrictions on the addresses at which an object of that type may be allocated. An alignment is an implementation-defined integer value representing the number of bytes between successive addresses at which a given object can be allocated. An object type imposes an alignment requirement on every object of that type; stricter alignment can be requested using the alignment specifier.

它将代表 16 个字节的对齐方式。

在某些处理器上,访问非对齐内存地址可能会导致异常。在其他情况下,非对齐内存访问可能有效,但可能不是最佳选择,可能需要在对齐地址处额外读取内存。实际需要或期望的对齐因上下文而异。

例如,在 32 位 x86 处理器上,32 位(4 字节)非对齐访问可能导致两个对齐内存访问。如果在地址 1 处读取 4 字节,处理器可能需要读取字节 0..3,然后读取字节 4..7,然后将字节 1..4 组合到结果中,丢弃额外数据阅读。

对于 SIMD 指令,对齐更大。 64 位 MMX 指令应该访问 64 位(8 字节)对齐的内存。 128 位 XMM 指令应该访问 128 位(16 字节)对齐的内存。

在 SPARC 处理器上,未对齐的内存访问会导致处理器异常。我相信 ARM 也会为未对齐的访问生成异常。在 x86 上,您在某些情况下也会遇到异常。特别是,如果堆栈没有正确对齐,可能会导致程序崩溃。通常由编译器处理的细节。