gpt4 book ai didi

c++ - 每个对象内存分配的开销是多少?

转载 作者:太空宇宙 更新时间:2023-11-04 08:00:46 25 4
gpt4 key购买 nike

<分区>

假设,如果我调用 malloc(sizeof(int)),请求 4 个字节,系统(或标准库?)将额外添加多少来支持内存管理基础设施?我相信应该有一些。否则,当我调用 free(ptr) 时,系统如何知道要处理多少字节。

更新 1:这听起来像是一个“过于宽泛的问题”,而且显然是特定于 C/C++ 库的,但我感兴趣的是支持单个分配所需的最小额外内存。甚至不是特定于系统或实现的。比如二叉树,必须有2个指针,分别是左 child 和右 child ,你怎么也挤不进去。

更新 2:我决定在 Windows 64 上亲自检查一下。

#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <psapi.h>
void main(int argc, char *argv[])
{
int m = (argc > 1) ? atoi(argv[1]) : 1;
int n = (argc > 2) ? atoi(argv[2]) : 0;
for (int i = 0; i < n; i++)
malloc(m);
size_t peakKb(0);
PROCESS_MEMORY_COUNTERS pmc;
if ( GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc)) )
peakKb = pmc.PeakWorkingSetSize >> 10;
printf("requested : %d kb, total: %d kb\n", (m*n) >> 10, peakKb);
_getch();
}

请求:0 kb,总计:2080 kb

1 字节:要求:976 kb,总计:17788 kb额外:17788 - 2080 - 976 = 14732 (+1410%)

2 个字节:要求:1953 kb,总计:17784 kb额外:17784 - 2080 - 1953 =(超过 +605%)

4 个字节:要求:3906 kb,总计:17796 kb额外:17796 - 2080 - 3906 = 10810 (+177%)

8 个字节:要求:7812 kb,总计:17784 kb额外:17784 - 2080 - 7812 = (0%)

更新 3:这是我一直在寻找的问题的答案:除了速度慢之外,默认 C++ 分配器的通用性使得它对于小对象的空间效率非常低。默认分配器管理一个内存池,而这种管理通常需要一些额外的内存。通常,簿记内存为每个分配了 new 的 block 增加了几个额外的字节(4 到 32)。如果您分配 1024 字节的 block ,则每个 block 的空间开销是微不足道的(0.4% 到 3%)。如果分配 8 字节的对象,每个对象的开销将变为 50% 到 400%,如果分配许多这样的小对象,这个数字足以让您担心。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com