类变量 - 对齐

use*_*708 5 c++ operators

可能重复:
类将数据成员存储在顺序存储器中?

只是想问为什么以下是正确的:

template<class T>
class Vec3 {
public:
  // values
  T x,y,z;

  // returns i-th komponent (i=0,1,2) (RHS array operator)
  const T operator[] (unsigned int i) const {
    return *(&x+i);
  }
}
Run Code Online (Sandbox Code Playgroud)

或换句话说:为什么始终保证x,y和z总是在内存中以sizeof(T)为单位.那些变量中的两个之间是否存在碎片孔,从而让这个操作符返回错误值?

Alo*_*ave 6

不能保证x,y并且在内存z中始终是sizeof(T)单位分开的.可以在两者之间添加填充字节.
它被省略为实现细节.
唯一保证的是,在类/结构的开头和POD结构/类的第一个成员之间不会有填充.

不保证operator[]您的代码中的实现始终有效.

参考:
C++ 11:9.2类成员[class.mem]

14)分配具有相同访问控制(第11条)的(非联合)类的非静态数据成员,以便后面的成员在类对象中具有更高的地址.未指定具有不同访问控制的非静态数据成员的分配顺序(11).实施对齐要求可能导致两个相邻成员不能立即分配; 因此,可能需要空间来管理虚拟功能(10.3)和虚拟基类(10.1).