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 上,您在某些情况下也会遇到异常。特别是,如果堆栈没有正确对齐,可能会导致程序崩溃。通常由编译器处理的细节。
有一个 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 上,您在某些情况下也会遇到异常。特别是,如果堆栈没有正确对齐,可能会导致程序崩溃。通常由编译器处理的细节。