可能重复:
类将数据成员存储在顺序存储器中?
只是想问为什么以下是正确的:
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)为单位.那些变量中的两个之间是否存在碎片孔,从而让这个操作符返回错误值?
它不能保证x,y并且在内存z中始终是sizeof(T)单位分开的.可以在两者之间添加填充字节.
它被省略为实现细节.
唯一保证的是,在类/结构的开头和POD结构/类的第一个成员之间不会有填充.
不保证operator[]您的代码中的实现始终有效.
参考:
C++ 11:9.2类成员[class.mem]
14)分配具有相同访问控制(第11条)的(非联合)类的非静态数据成员,以便后面的成员在类对象中具有更高的地址.未指定具有不同访问控制的非静态数据成员的分配顺序(11).实施对齐要求可能导致两个相邻成员不能立即分配; 因此,可能需要空间来管理虚拟功能(10.3)和虚拟基类(10.1).