【发布时间】:2012-01-05 23:18:39
【问题描述】:
在 Mac 上试用 std::tr1::array 我得到 16 字节对齐。
sizeof(int) = 4;
sizeof( std::tr1::array< int,3 > ) = 16;
sizeof( std::tr1::array< int,4 > ) = 16;
sizeof( std::tr1::array< int,5 > ) = 32;
STL 中是否有任何行为类似于 array
sizeof( ARRAY< T, N> ) = sizeof( T )*N
【问题讨论】:
-
是的,它内置在语言中:
T a[N]; static_assert(sizeof(a) == sizeof(T)*N);。 -
你使用什么标准库导致这种奇怪的填充?
-
哈哈当然可以。我的意思是带有附加方法的包装集合,例如适合插入基于范围的范围或采用每个元素的赋值/转换运算符。这来自 mac osx 10.7,target = 64bit intel,LLVM 3.0。他们对 std::tr1::array 的实现声明了 atttribute(__aligned ) 这可能就是为什么 :( 当然,人们希望 aligned 完成它的工作,而不是成为默认
-
@centaurian_slug:不,一切都是并且应该默认对齐。问题是为什么/这个特定类的对齐比它需要的更严格
-
-对不起,如果我的最后一行听起来不精确。是的,我知道大多数 CPU 更喜欢类型有自己的 自己的对齐,因此这是默认值,我确实希望如此。但是属性(aligned)对我来说意味着选择一些“额外”对齐超出默认值(动机通常是用于宽 SIMD 加载/存储或缓存行).. 绝对出乎意料行为。
标签: c++ arrays vector alignment padding