C++ C+中的内存对齐语法+;

C++ C+中的内存对齐语法+;,c++,memory-alignment,C++,Memory Alignment,什么决定了C/C++内存对齐语法 我正在开发一些需要内存/数据对齐的嵌入式应用程序。 根据我以前的经验,对于使用GCC和MSVC的C代码,内存对齐语法似乎主要由编译器决定: GCC __attribute__ ((aligned (128))) MSVC __declspec(align(128)) 我对以下问题感到好奇: 对齐语法是否还取决于其他因素,例如 操作系统的目标硬件和/或数据模型?还是完全依赖 在编译器上 对于C++11,新语法alignas(128)是C++11的一部分吗

什么决定了C/C++内存对齐语法

我正在开发一些需要内存/数据对齐的嵌入式应用程序。 根据我以前的经验,对于使用GCC和MSVC的C代码,内存对齐语法似乎主要由编译器决定:

GCC   __attribute__ ((aligned (128)))
MSVC   __declspec(align(128))
我对以下问题感到好奇:

  • 对齐语法是否还取决于其他因素,例如 操作系统的目标硬件和/或数据模型?还是完全依赖 在编译器上
  • 对于C++11,新语法
    alignas(128)
    是C++11的一部分吗 标准,因此独立于编译器/平台
  • 对于C++11,当我们在数据上使用
    std::align
    时,它会执行完整的数据处理吗 复制从而妨碍性能
  • 语法不随目标的不同而变化
  • 对, 是C++ 11以来的C++关键字,但是注释:

    如果声明中最严格(最大)的对齐方式弱于 没有任何
    alignas
    说明符(即, 弱于其自然对齐或弱于另一个上的
    alignas
    声明相同的对象或类型),程序格式不正确

    由于类型在不同平台上具有不同的对齐方式,这可能适用于一个目标平台,而不适用于另一个目标平台:

    struct alignas(2) foo { int bar; };
    
  • 否,不复制数据。如果需要,它会修改指针和
    大小\u t
    空间计数器。 如果缓冲区太小,则函数不执行任何操作并返回
    nullptr


  • 谢谢你的回答。我仍然对(2)中的“格式错误”程序感到好奇,它是意味着它将被忽略,还是意味着未定义的行为?@knightyangpku如果我读得正确,它应该会导致错误,但是
    g++
    只是忽略它,并在需要时增加对齐
    clang++
    将其作为硬错误拒绝:“错误:请求的对齐方式小于for类型的最小对齐方式”