POD对象传染媒介记忆布局

时间:2015-05-11 12:47:10

标签: c++ memory vector

假设我有一个简单的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个浮点数的数组是否安全?

1 个答案:

答案 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个连续浮点数。