存储器去了哪里?

问题描述 投票:0回答:2
class Node
{
//some member variables.
};
std::cout<<"size of the class is "<<sizeof(Node)<<"\n";
int pm1 =peakmemory();
std::cout<<"Peak memory before loop is "<< pm1<<"\n";
for(i=0; i< nNode; ++i)
{
  Node * p = new Node;
}
int pm2 =peakmemory();
std::cout<<"Peak memory after loop is "<< pm2<<"\n";

我以为pm2-pm1近似于nNode * sizeof(Node)。但是事实证明pm2-pm1nNode *sizeof(Node)大得多。记忆去了哪里?我怀疑sizeof(Node)不能反映正确的内存使用情况。

我已经在Windows和Linux上进行了测试。最终结论是Node * p = new Node;将分配一个大于sizeof(Node)的内存,其中Node是一个类。

c++ pointers memory sizeof
2个回答
2
投票

由于您尚未指定正在运行的平台,因此有以下几种可能性:

  1. [分配大小:您的C ++实现可能正在以大于sizeof(Node)的单位分配内存,例如限制它的簿记数量。
  2. 对齐方式:分配器可能有一个返回地址的策略,该地址以最小的2的幂次对齐。同样,这可以在某种程度上简化其实现。
  3. 开销:除了正在使用的内存之外,某些分配器还使用固定模式的填充来防止内存损坏。或分配器使用的某些元数据。
  4. 这并不是说

    实际上

发生。但是可以它当然符合语言规范(AFAICT)。

0
投票
几乎所有的内存分配器(例如linux / win32上的内存分配器)都有一个分配标头,用于进行内存分配(包括有关分配大小的信息)。例如,在linux上,您可以查看malloc的源,它提供了有关存储的标头(以及如何计算其大小)的信息:
© www.soinside.com 2019 - 2024. All rights reserved.