4

最新的 c++11 标准草案中,第 3.11 章讨论了对齐。
稍后,第 7.6.1 章定义了如何定义对齐的结构(或变量?)

如果我定义这样的结构:

alignas(16) struct A
{
  int n;
  unsigned char[ 1020 ];
};

这是否意味着 A 类的所有实例都将对齐到 16 个字节?

或者,我必须像在下一个代码中那样做吗?

struct A
{
  char data[300];
};
alignas(16) A a;

如果两个例子都是错误的,如何正确地做呢?

PS我不是在寻找依赖于编译器的解决方案。

4

1 回答 1

3

对齐首先是类型的属性。

可以用alignas;覆盖它的类型。alignas用于为特定对象分配新的对齐值。

因此,这两个示例都是有效的,并且将具有您假定的语义。

[n3290: 3.11/1]:对象类型具有对齐要求(3.9.1、3.9.2),这些要求限制了可以分配该类型对象的地址。对齐是实现定义的整数值,表示可以分配给定对象的连续地址之间的字节数。对象类型对该类型的每个对象都有对齐要求; 可以使用对齐说明符(7.6.2)请求更严格的对齐。

[n3290: 7.6.2/1]: 对齐说明可以应用于变量或类数据成员,但不应应用于位字段、函数参数、catch 子句 (15.3) 的形式参数或使用register存储类说明符。对齐说明也可以应用于类或枚举类型的声明。 带有省略号的对齐说明符是包扩展 (14.5.3)。

[n3290: 7.6.2/2]:当对齐说明符的形式为 alignas( assignment-expression ):

  • 赋值表达式应该是一个整数常量表达式
  • 如果常量表达式计算为基本对齐,则声明实体的对齐要求应为指定的基本对齐
  • 如果常量表达式计算为扩展对齐并且实现在声明的上下文中支持该对齐,则声明实体的对齐应为该对齐
  • 如果常量表达式的计算结果为扩展对齐并且实现在声明的上下文中不支持该对齐,则程序格式错误
  • 如果常量表达式的计算结果为零,则对齐说明符将无效
  • 否则,程序格式错误。
于 2011-09-21T14:20:24.470 回答