__align 类型限定符(IBM 扩展)

__align 限定符是一种语言扩展,允许您指定聚集变量或静态 (或全局) 变量的显式对齐。 指定的字节边界会影响聚集整体的对齐,而不会影响其成员的对齐。 __align 限定符可以应用于嵌套在另一聚集定义中的聚集定义,但不能应用于聚集的个别元素。 对于参数和自动变量,将忽略对齐规范。

声明采用以下格式之一:

简单变量的 __align 限定符语法

读取语法图跳过可视语法图类型说明符 __align(int_constant) 声明符

结构或并集的 __align 限定符语法

读取语法图跳过可视语法图__align(int_constant ) structunion 标记标识{member_声明者列表 };
其中 int_constant 是指示字节对齐边界的正整数值。 法律值是 2 的幂,最多 32768
以下限制和限制适用:
  • 如果变量对齐的大小小于类型对齐的大小,那么不能使用 __align 限定符。
  • 并非所有对齐都可以在对象文件中表示。
  • __align 限定符无法应用于以下内容:
    • 聚集定义中的各个元素。
    • 数组的各个元素。
    • 类型不完整的变量。
    • 已声明但未定义聚集。
    • 其他类型的声明或定义,例如 typedef ,函数或枚举。

使用 __align 限定符的示例

__align 应用于静态变量或全局变量:

// varA is aligned on a 1024-byte boundary and padded with 1020 bytes
int __align(1024) varA;

int main()                     
{...}                                 

// varB is aligned on a 512-byte boundary and padded with 508 bytes
static int __align(512) varB;

// Error
int __align(128) functionB( );

// Error
typedef int __align(128) T;

// Error
__align enum C {a, b, c};

应用 __align 以对齐和填充聚集标记而不影响聚集成员:

// Struct structA is aligned on a 1024-byte boundary
// with size including padding of 1024 bytes.
__align(1024) struct structA 
{
   int i; 
   int j;
};


// Union unionA is aligned on a 1024-byte boundary
// with size including padding of 1024 bytes.
__align(1024) union unionA 
{
   int i; 
   int j;
};

__align 应用于结构或并集,其中使用该结构或并集的聚集的大小和对齐受到影响:

// sizeof(struct S) == 128
__align(128) struct S {int i;}; 

// sarray is aligned on 128-byte boundary with sizeof(sarray) == 1280
struct S sarray[10];                

// Error: alignment of variable is smaller than alignment of type 
struct S __align(64) svar;          

// s2 is aligned on 128-byte boundary with sizeof(s2) == 256
struct S2 {struct S s1; int a;} s2;

__align 应用于数组:

在以下示例中,只有 arrayA 在 64 字节边界上对齐,并且该数组中的元素根据 AnyType的对齐进行对齐。 填充在数组开头之前应用,不会影响数组成员本身的大小。

AnyType __align(64) arrayA[10];

应用 __align ,其中变量对齐的大小与类型对齐的大小不同:

__align(64) struct S {int i;};

// Error: alignment of variable is smaller than alignment of type.
struct S __align(32) s1;

// s2 is aligned on 128-byte boundary
struct S __align(128) s2;

// Error
struct S __align(16) s3[10];

// Error
int __align(1) s4;

// Error
__align(1) struct S {int i;};