指向指针向量的指针的内存消耗

时间:2012-03-20 23:34:12

标签: c++ pointers

我知道指针的大小是固定的(不是它指向的数据的大小)。现在考虑到这一点,假设我在全局范围内有一个数据向量,并且我声明指向一些/所有全局数据的指针向量的指针,这将额外使用多少内存(RAM)?我在这里完全不知所措,肯定会感谢一些想法/建议。我希望额外的内存消耗只是向量的大小乘以指针的固定大小(比如8字节),而不管数据的复杂程度如何;因为它指向的数据存在于全球范围内(即,没有分配新的数据;希望我已清楚地解释了我的想法)。

表达我的问题的一些伪代码看起来像:

std::vector<data> global_data;
std::vector<data*>* my_data = new std::vector<data*>();  //-Is this even valid? 
//-Now populate the vector with pointers to data in global_data
for(int i=0; i<global_data.size(); ++i) {
   my_data->push_back(&global_data[i]);
}

然后我的问题是,在 m_data 中,RAM中有多少额外的内存(即超过已经使用的内容来创建 global_data )。

5 个答案:

答案 0 :(得分:6)

my_data将占用sizeof(std::vector<data*>*)个字节,且不超过sizeof(void*)

*my_data将占用sizeof(std::vector<data*>),其可能只有3 * sizeof(data**),即不超过3 * sizeof(void*)

*my_data将管理sizeof(data*) * my_data->capacity()字节的动态内存。


我严重怀疑这些信息在实践中是否有用。

答案 1 :(得分:2)

如果我理解你的问题,你想知道你的载体消耗了多少内存。这将是指针的固定大小(32或64位)乘以存储在其中的指针数量,加上大小字段和内容的一些额外字节。因此,在大多数情况下,您将无法识别它使用的内存。

但是,你绝对不应该像在代码示例中那样做。因为std :: vector我改变了保存数据的位置。例如。如果你push_back新对象,它最终将不得不分配新的内存并将数据复制到新分配的空间,因为它保证数据空间继续。然后它将释放bevore使用的内存。您的旧指针将指向空间,如果您尝试使用它们,您的程序将不再使用该空间导致分段错误。

答案 2 :(得分:1)

由于“虚拟内存”,使用多少“RAM”并不是那么简单,但我们可以讨论将消耗多少虚拟内存。答案大致和预期的一样,加上更多:

  • 向量中的元素数量*每个元素的大小(即指针的大小)。
  • 在向量中加上一些额外的“容量”,以避免不断调整大小(可能是一些小的常量因素,你可以通过调用capacity()来查询它。)
  • 加上矢量的实现细节,可能是例如三个指针(开始,结束,开始+容量)。

如果你想用C ++表达,你可能会这样做:

sizeof(vector<data*>) + my_data.capacity() * sizeof(data*);

请注意,这只是给你一个粗略的猜测,并忽略了更复杂的部分,比如是否需要更多“RAM”来实际映射你在应用程序空间中使用的内存,以及标准分配器在你的行为上的行为但就C ++和虚拟内存而言,我认为这是一个合理的近似值。

答案 3 :(得分:1)

Re:我希望额外的内存消耗只是向量的大小乘以指针的固定大小(比如8个字节),而不管数据的复杂程度如何;因为它指向的数据存在于全球范围内(即,没有分配新数据;希望我已经清楚地解释了我的想法)。

你基本上是对的。对于std::vector的任何合理实现,std::vector<T>的基础存储只是T的紧凑数组。在这种情况下,您的T是指针类型data *,而不是data

可能有一些额外的存储空间用于有效扩展,但是每个push_back操作都需要增加数组。 (查看reserve的{​​{1}}和capacity函数。)

当然,分配矢量对象本身会有一些小的开销。

答案 4 :(得分:1)

向量的内存消耗接近您猜测的内存消耗。你是对的,矢量的大小将与data的布局无关。

至于实际计算向量的总大小,有两个部分有贡献:

  1. 实际的矢量对象本身。向量具有一些内部结构,例如,它有一个指向它的内部数组的指针。此外,其所有字段都与特定值对齐。可以使用sizeof(vector<data*>)找到任何向量的总大小(包括对齐)。在我的机器上,这给了24

  2. 内部数组的大小。这是 not 基于向量的size(),但实际上取决于向量的capacity()。总大小为my_data->capacitiy() * sizeof(data*)。我相信数组元素之间没有填充,但是如果存在,也必须考虑到这一点。

  3. 总内存消耗只是#1和#2的总和。