【问题标题】:strange behaviour of std::aligned_storagestd::aligned_storage 的奇怪行为
【发布时间】:2013-03-05 18:08:39
【问题描述】:
_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 对齐?

【问题讨论】:

  • 能否添加与您的编译器版本对应的visual-studio-20xx标签?

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


【解决方案1】:

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

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

——[basic.align] 3.11/3

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

【讨论】:

    【解决方案2】:

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

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

    32
    32
    

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

    【讨论】:

    • vs 中似乎不支持 alignas。感谢您指出这一点。
    猜你喜欢
    • 2011-03-06
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多