C++成员布局

dem*_*emi 6 c c++ layout pointers member

我们有一个简单的结构(POD).

struct xyz
{
    float x, y, z;
};
Run Code Online (Sandbox Code Playgroud)

我可以假设以下代码没问题吗?我可以假设没有任何差距吗?标准说的是什么?对于POD来说是真的吗?课程是真的吗?

xyz v;
float* p = &v.x;
p[0] = 1.0f;
p[1] = 2.0f; // Is it ok?
p[2] = 3.0f; // Is it ok?
Run Code Online (Sandbox Code Playgroud)

Jar*_*Par 10

这里的答案有点棘手.C++标准表示POD数据类型将具有C布局兼容性保证(参考).根据C规范的第9.2节,结构的成员将按顺序排列

  1. 没有可访问性修饰符差异
  2. 数据类型没有对齐问题

所以,只要该类型float在当前平台上具有兼容的对齐(它是平台字大小),这个解决方案就可以工作.所以这适用于32位处理器,但我的猜测是64位处理器会失败.基本上在任何sizeof(void*)不同的地方sizeof(float)

  • 在实践中,这应该适用于我能想到的任何平台.只要sizeof(float)== alignment_of(float),就本质上而言.但是标准并不保证,因为对齐是实现定义的.我不认为sizeof(void*)与它有任何关系. (2认同)

JSB*_*ոգչ 5

标准不保证这一点,并且不适用于许多系统.原因是:

  • 编译器可以将结构成员对准目标平台,这可能意味着32位对齐,64位对齐或其他任何内容.
  • float的大小可能是32位,或64位.不能保证它与struct成员对齐相同.

这意味着它p[1]可能位于同一位置xyz.y,或者可能部分重叠,或者根本不重叠.