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

ad3*_*l1s 5 c c++ compilation

在这样的定义里面

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

myStruct obj;
Run Code Online (Sandbox Code Playgroud)

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

(&obj == &obj.array[0])
Run Code Online (Sandbox Code Playgroud)

将返回TRUE或我应该担心编译器引入额外的填充以适应myType对齐必需品?理论上这不应该发生,因为结构有一个单独的字段,但我不完全确定这一点.

eer*_*ika 6

根据目前的C++标准草案[class.mem]§20(N4527),重点补充说:

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

是否myStruct标准布局,取决于是否myType是标准布局.如果是,那么你要求的是c ++标准.

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


dbu*_*ush 6

通过适当的演员表演,这将永远返回true.

C标准的第6.7.2.1节开始:

13.在一个结构物中,非位字段构件和单元,其中位字段驻留具有在其声明的顺序增加的地址. 指向适当转换的结构对象的指针指向其初始成员 (或者如果该成员是位字段,则指向它所在的单元),反之亦然. 结构对象中可能存在未命名的填充,但不是在其开头.