std :: aligned_storage的奇怪行为

时间:2013-03-17 09:35:48

标签: c++ c++11 visual-studio-2012 alignment

_declspec(align(32)) struct St{ 
    int foo; 
};
typedef std::aligned_storage<sizeof(St), std::alignment_of<St>::value>::type Ta;

int main() {
    std::cout << std::alignment_of<St>::value << '\n'; 
    std::cout << std::alignment_of<Ta>::value << '\n';
    return 0;
}

输出是:

32
8

我正在使用msvc(visual studio 2012)。 Ta是否与32对齐,或只是8?

2 个答案:

答案 0 :(得分:3)

VS2012 max_align_t为8,这意味着所有上下文中支持的最大对齐方式为8.大于此值的对齐是“扩展对齐”和

  

是否支持任何扩展对齐以及支持它们的上下文是实现定义的。

     

- [basic.align] 3.11 / 3

Microsoft的对齐说明符允许扩展对齐,但是它们正在使用的标准库的实现不支持它们。虽然这似乎不符合要求但对我来说似乎是一个QoI问题。

答案 1 :(得分:2)

我将您的示例转换为标准C ++ 11,将struct alignas(32) St{替换为_declspec(align(32)) struct St{

然后我在我的系统(clang ++ / libc ++)OS X上运行它。我的结果是:

32
32

如果我将32更改为16或64,我将继续为StTa获得相同的对齐方式。我怀疑这是你正在使用的实现中的一个错误。