有一个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)字节的对齐?
答案 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]
对象类型具有对齐要求 对该类型的对象可能的地址的限制 分配。对齐是实现定义的整数值 表示连续地址之间的字节数 可以分配给定的对象。对象类型强制对齐 对该类型的每个对象的要求;更严格的对齐可以 请求使用对齐说明符。