在新结构中声明的数组的地址

时间:2016-05-03 13:17:57

标签: c++ c compilation

在像这样的定义中

var imgWheel = new wheelnav("divId");
imgWheel.createWheel(["imgsrc:img/menu1.png","imgsrc:img/menu2.png","imgsrc:img/menu3.png"]);

我可以一直假设([编辑]假设正确的施法会发生,这不是问题的焦点[/ edit])

typedef struct 
{
    myType array[N];
} myStruct;

myStruct obj;

将返回TRUE或者我应该担心编译器引入额外的填充以容纳myType对齐必需品吗?从理论上讲,这不应该发生,因为结构只有一个字段,但我对此并不完全确定。

2 个答案:

答案 0 :(得分:6)

根据当前的C ++标准草案[class.mem] §20 (N4527),强调增加了:

  

如果标准布局类对象有任何非静态数据成员, 其地址与地址相同   其第一个非静态数据成员 。否则,其地址与其第一个基类的地址相同   子对象(如果有的话)。 [注意:因此在标准布局结构中可能存在未命名的填充   对象, 但不是在开头,以实现适当的对齐 。 - 结束说明]

myStruct是否为标准布局,取决于myType是否为标准布局。如果是,那么你所要求的就是c ++标准所保证的。

请注意&obj&obj.array[0]具有不相关的指针类型,因此表达式在c ++中不合法。

答案 1 :(得分:6)

通过适当的演员,这将始终返回true。

来自C standard的第6.7.2.1节:

  

13. 在结构对象中,非位字段成员和位域所在的单位具有增加的地址   按声明的顺序排列。 指向结构的指针   对象,适当转换,指向其初始成员(或   如果该成员是一个位字段,那么到它所在的单位   居住),反之亦然。 a内可能有未命名的填充   结构对象,但不是在它的开头。