2011-09-21 80 views
4

latest draft of the c++11 standard中,第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我不是在寻找一个依赖编译器的解决方案。

+2

仅供参考,n3242不是最新的草案。 :) –

回答

3

对齐首先是属性类型。

它可以覆盖alignas; alignas可以使用还可以使用将新对齐值分配给特定对象。

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

[n3290: 3.11/1]:对象类型有对准要求(3.9.1,3.9.2 ),其上的地址位置限制在其 一个对象,该类型可被分配。一个对齐是一个实现定义的 整数值,表示可以分配给定对象的连续 地址之间的字节数。 对象类型 对该类型的每个对象强加一个对齐要求; 可以使用对齐说明符 (7.6.2)来请求更严格的对齐。

[n3290: 7.6.2/1]:一种对准说明符可以应用于一个 变量或一类数据成员,但它不应被施加到 位字段,一个功能参数,一个锁扣的形式参数 子句(15.3)或用register存储类 说明符声明的变量。 对齐说明符也可应用于类或枚举类型的 声明。一个对齐说明符 用省略号是一个包扩展(14.5.3)。

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

  • 赋值表达式必须是一个积分常数表达式
  • 如果常数表达式计算 到一个基本对准,的对齐要求如果常量 表达式评估为扩展对齐,则声明的 实体应为指定的基本对齐
  • 实施 支持,在声明的范围内对准,声明的实体的 对准应是对准
  • 如果 常量表达式的计算结果为延长的对准和 实现不支持在的上下文中该对准 声明,该程序是形成不良的
  • 如果常量表达式 计算结果为零,对齐方式指定应无否则,是形成不良的程序效果
+0

你可以添加一个例子吗? –

+0

@VJo:哼?你的问题有两个例子。这个问题是关于验证第一个例子,不是吗? –

+0

对!我没有马上写下如此多的文字。 –

相关问题