_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?
答案 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,我将继续为St
和Ta
获得相同的对齐方式。我怀疑这是你正在使用的实现中的一个错误。