假设我有一个简单的C ++类,
class Data {
public:
float data[3];
void clear() { data[0] = 0.0f; data[1] = 0.0f; data[2] = 0.0f }
}
数据传真,
std::vector<Data> v(10);
假设&v[0].data[0]
指向30个浮点数的数组是否安全?
答案 0 :(得分:4)
从标准
23.3.6.1班级模板矢量概述
a的元素 向量是连续存储的,这意味着如果v是一个向量,其中T是某种类型的其他类型 对于所有0&lt; = n&lt;而不是bool,它遵循身份&amp; v [n] ==&amp; v [0] + n。 v.size()
所以&v[0]
确实指向了10个连续Data
个对象的开头。
但是我们有Data
的布局
9.2.13班级成员
具有相同访问控制(第11条)的(非联合)类的非静态数据成员被分配 后来的成员在类对象中有更高的地址。非静态数据的分配顺序 具有不同访问控制的成员未指定(11)。实施对齐要求可能 导致两个相邻成员不能立即分配; 所以可能要求 用于管理虚拟功能(10.3)和虚拟基类(10.1)的空间。
所以我们无法确定sizeof(Data) == 3*sizeof(float)
,因此一般答案应该是:它不能保存为30个连续浮点数。