代码之家  ›  专栏  ›  技术社区  ›  PkDrew

在结构定义中声明“alignas”关键字与结构定义的数组之间有什么区别吗?

  •  2
  • PkDrew  · 技术社区  · 1 年前

    假设我有一个名为 Particle 我希望它按32位对齐,我应该使用 alignas 当我指定结构体定义时,使用关键字,如下代码所示:

    struct alignas(32) Particle {
        // Total size: 16 bytes, but alignas(32) ensures 32-byte alignment
        float x; // 4 bytes
        float y; // 4 bytes
        float z; // 4 bytes
        float w; // 4 bytes 
    };
    

    或者我应该在结构所在的布局的定义中指定它,如下所示:

    alignas(32) Particle particles[8]; // Array of 8 particles, 32-byte aligned
    

    还是我应该两者都做?

    1 回复  |  直到 1 年前
        1
  •  3
  •   Ted Lyngmo    1 年前

    您尚未放置 alignas 在第一个例子中的正确位置,但是:

    1. 对齐第一个成员 struct 将确保每个实例 struct Particle 根据您的规格对齐:
      struct Particle  {
          alignas(32) float x; // 4 bytes
          float y; // 4 bytes
          float z; // 4 bytes
          float w; // 4 bytes 
      };
      
      struct Particle particles[8];
      ... = &particles[0];            // aligned to 32
      ... = &particles[1];            // aligned to 32
      
    2. 仅对齐 例子 只会确保数组中的第一个实例按照您的规范对齐。
      struct Particle  {
          float x; // 4 bytes
          float y; // 4 bytes
          float z; // 4 bytes
          float w; // 4 bytes 
      };
      
      alignas(32) struct Particle particles[8];
      ... = &particles[0];            // aligned to 32
      ... = &particles[1];            // not aligned to 32