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

时间:2015-09-16 04:27:38

标签: c++ boost memory-alignment

有一个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)字节的对齐?

2 个答案:

答案 0 :(得分:2)

它代表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上,您还可以在某些情况下获得异常。特别是,如果堆栈未正确对齐,则可能导致程序崩溃。通常由编译器处理的细节。

答案 1 :(得分:1)

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

  

[basic.align]

     

对象类型具有对齐要求   对该类型的对象可能的地址的限制   分配。对齐是实现定义的整数值   表示连续地址之间的字节数   可以分配给定的对象。对象类型强制对齐   对该类型的每个对象的要求;更严格的对齐可以   请求使用对齐说明符。