【问题标题】:How does vectors in C++ use memory? [duplicate]C++ 中的向量如何使用内存? [复制]
【发布时间】:2021-09-04 20:12:55
【问题描述】:
#include <iostream>
#include <vector>

int main(int argc, char const *argv[])
{
    std::vector<int> a(32768, 0);
    std::cout << "Size " << sizeof a << "\nCapacity " << a.capacity() << "\nElements " << a.size();
    return 0;
}

对于这个程序,我得到了输出:

Size 24
Capacity 32768
Elements 32768

使用 valgrind 我计算了堆使用量:

132096 字节

即(32768 x 4 字节)+ 24 字节

我对向量 a 如何使用这 24 个字节感兴趣

【问题讨论】:

  • 例如stackoverflow.com/questions/30422205/… 是否回答了您的问题? that is (32768 x 4 bytes) + 24 bytes 那是……巧合,它等于那个。
  • 这 24 个字节可能与实现有关。如果您想了解更多,只需打开 头文件 :) 您还可以查找“小向量优化”。
  • @KamilCuk 谢谢你解释了这一切:)
  • @PKramer 是的,谢谢你的建议
  • 一个向量从空闲存储区分配内存(通常是堆,或者它在我目前工作的所有平台上)。当容量不足时,它会分配更多内存。除非请求,否则它不会释放额外容量的内存。我的系统为mallocnewnew[] 维护单独的堆......但这是一个实现细节,有助于消除内存管理错误。

标签: c++ memory stdvector


【解决方案1】:

正如 Kamil 在 cmets 中所述,std::vector 在内部跟踪三个指针。一个指向开始的指针,一个指向结束的指针,一个指向分配内存末尾的指针(请参阅stack post)。现在,在任何 64 位 C/C++ 编译器上,指针的大小应该是 8 字节,因此,3 * 8 字节 = 24 字节(请参阅 wiki)。

【讨论】:

  • 这个具体实现不是标准要求的,只是流行。
猜你喜欢
  • 2014-03-15
  • 2017-03-08
  • 2014-09-18
  • 1970-01-01
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-05
相关资源
最近更新 更多