__align 类型限定符(IBM 扩展)
__align 限定符是一种语言扩展,允许您指定聚集变量或静态 (或全局) 变量的显式对齐。 指定的字节边界会影响聚集整体的对齐,而不会影响其成员的对齐。 __align 限定符可以应用于嵌套在另一聚集定义中的聚集定义,但不能应用于聚集的个别元素。 对于参数和自动变量,将忽略对齐规范。
声明采用以下格式之一:
以下限制和限制适用:
- 如果变量对齐的大小小于类型对齐的大小,那么不能使用
__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;};