1
_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?

4

2 回答 2

3

VS2012max_align_t为 8,这意味着在所有上下文中支持的最大对齐为 8。大于此值的对齐是“扩展对齐”和

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

[basic.align] 3.11/3

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

于 2013-03-18T16:12:19.210 回答
2

我通过替换将您的示例翻译成标准 C++ struct alignas(32) St{11 _declspec(align(32)) struct St{

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

32
32

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

于 2013-03-17T15:57:48.047 回答