【问题标题】:Memory layout of vector of POD objectsPOD 对象向量的内存布局
【发布时间】:2015-07-21 23:32:40
【问题描述】:

假设我有一个简单的 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);

假设&amp;v[0].data[0] 指向一个包含 30 个浮点数的数组是否安全?

【问题讨论】:

  • 它是否指向 30 个连续的 float?是的。它是否指向数组 30 float?不,有区别。遍历每个Data,然后遍历其中的每个data 会安全得多。
  • @Cyber​​ 填充呢?
  • 我想这个问题不是很有趣,不了解问题是什么。您想将向量视为一个平面数组并对其进行索引吗?
  • 安全吗?可能不是。但话虽如此,我已经使用依赖于此类行为的程序编写了几个内存映射。使用打包编译指示和编译时间 sizeof 断言。

标签: c++ memory vector


【解决方案1】:

来自标准

23.3.6.1 类模板向量概述

a 的元素 向量是连续存储的,这意味着如果 v 是一个向量,其中 T 是其他类型 比布尔值,那么它服从所有 0 的恒等式 &v[n] == &v[0] + n

所以&amp;v[0]确实指向10个连续Data对象的开始。

但是对于Data 的布局,我们有

9.2.13 班级成员

具有相同访问控制(第 11 条)的(非联合)类的非静态数据成员被分配,因此 后来的成员在类对象中具有更高的地址。非静态数据的分配顺序 具有不同访问控制的成员未指定 (11)。实施对齐要求可能 导致两个相邻的成员不被紧随其后地分配; 可能要求 用于管理虚函数 (10.3) 和虚基类 (10.1) 的空间。

所以我们不能确定 sizeof(Data) == 3*sizeof(float),因此一般答案应该是:假设 30 个连续浮动是不保存的。

【讨论】:

  • 那只回答了一半的问题。他们基本上是在询问所有内部数组是否彼此相邻。
猜你喜欢
  • 2014-03-07
  • 2010-12-10
  • 2019-07-24
  • 1970-01-01
  • 2023-03-27
  • 2019-06-09
  • 2014-09-22
  • 1970-01-01
  • 2015-08-27
相关资源
最近更新 更多