std::aligned_storage的奇怪行为

strange behaviour of std::aligned_storage

本文关键字:storage aligned std      更新时间:2023-10-16
_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?

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

是否支持扩展对齐以及支持扩展对齐的上下文是由实现定义的。

本;[基本。对齐]3.11/3

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

我将struct alignas(32) St{替换为_declspec(align(32)) struct St{,将您的示例翻译成标准c++ 11。

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

32
32

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