C++ 为什么此代码与MSVC产生无效对齐?

C++ 为什么此代码与MSVC产生无效对齐?,c++,visual-c++,c++11,memory-alignment,C++,Visual C++,C++11,Memory Alignment,我已经在ideone.com上测试了这段代码,它应该输出16。但是,当我在Visual Studio 2013中尝试时,它显示了8。这是一个bug还是缺少编译器对C++11的支持 #include <iostream> #include <type_traits> using namespace std; using float_pack = aligned_storage<4 * sizeof(float), 16>::type; int main() {

我已经在ideone.com上测试了这段代码,它应该输出
16
。但是,当我在Visual Studio 2013中尝试时,它显示了
8
。这是一个bug还是缺少编译器对C++11的支持

#include <iostream>
#include <type_traits>
using namespace std;
using float_pack = aligned_storage<4 * sizeof(float), 16>::type;
int main() {

    cout << alignment_of<float_pack>::value << endl;
    return 0;
}

输出为
16
。这是否意味着编译器在使用扩展时可以提供更大的对齐?为什么我不能用
对齐的\u存储实现相同的结果
?只是因为MSVC没有提供
对齐的存储

看起来
std::max\u align\u t
8
,:


std::cout
std::aligned_存储
根据您提供的对齐要求定义了一种大小
Len
。如果您要求不支持的对齐方式,则说明您的程序格式不正确

template <std::size_t Len, std::size_t Align
    = default-alignment > struct aligned_storage;
-[完注]

对于
alignas

7.6.2对齐说明符[dcl.align] 1对齐说明符可应用于变量或类数据成员,但不得应用于位字段、函数参数、catch子句(15.3)的形式参数或用寄存器存储类说明符声明的变量。对齐说明符也可以应用于类或枚举类型的声明。带省略号的对齐说明符是块扩展(14.5.3)。
2当对齐说明符的形式为alignas(赋值表达式)时:
-赋值表达式应为整型常量表达式
-如果常量表达式的计算结果为基本对齐,则 声明的实体应为规定的基本路线
-如果常量表达式的计算结果为扩展对齐,并且实现支持该对齐 对齐在声明的上下文中,被声明实体的对齐应为该对齐
-如果常量表达式的计算结果为扩展对齐,且实现不支持
在声明的上下文中,程序的格式是错误的 -如果常量表达式的计算结果为零,则对齐说明符应无效
-否则,程序的格式就不正确

template <std::size_t Len, std::size_t Align
    = default-alignment > struct aligned_storage;

对过度对齐类型的支持实际上是在所有上下文中定义的实现。在使用Visual C++编写X86时,最大的基本对齐是8字节。@ JamesMcNellis是在任何地方记录的,我想把它添加到我的答案中。@ ShafikYaghmour:代码> >代码>定义:代码> STD::Max SaleTyt t/代码>是类型<代码>双< /代码>,和<代码> siZeof(double)=8 < /COD> 20.7.7.6。“
Align
对于某些类型
T
,shell应等于
alignof(T)
”,因此,如果没有提供具有16字节对齐方式的标准类型,则此代码不符合标准。MSVC当然知道SSE的
\u m128
类型,因此实际上存在一个具有对齐方式的类型
alignof(std::max\u Align\u T)
template <std::size_t Len, std::size_t Align
    = default-alignment > struct aligned_storage;
template <std::size_t Len, std::size_t Alignment>
struct aligned_storage {
    typedef struct {
        alignas(Alignment) unsigned char __data[Len];
    } type;
};