c++分配的字节比要求的多
C++ allocates more bytes than asked?
int main(int argc, const char* argv[])
{
for(unsigned int i = 0; i < 10000000; i++)
char *c = new char;
cin.get();
}
在上面的代码中,为什么我的程序使用471MB内存而不是像人们期望的那样使用10MB内存?
RAM的分配来自运行时库和操作系统的共同努力。为了识别示例代码请求的一个字节,有一些结构可以将此内存识别到运行时。它有时是一个双链表,但它由操作系统和运行时实现定义。
你可以这样类比:如果你有一个链表容器,你感兴趣的只是你在每个链接中放置的东西,但是为了维护链表,容器必须有指向容器中其他链接的指针。
如果您使用调试器或其他调试工具来跟踪内存,这些结构可能更大,使每个分配的成本更高。
RAM通常不会从数组中分配,但是可以重载new操作符来改变分配行为。可以从一个数组(在您的示例中是一个大数组)中专门分配,以便分配表现为您所期望的,并且在某些应用程序中,这是控制内存和提高性能的特定策略(尽管细节通常比简单的说明更复杂)。
分配不仅包含已分配的内存本身,还至少包含一个字,告诉delete
它必须释放多少内存;此外,这是一个必须正确对齐的数字,因此在分配的字符之后将有一定的填充,以确保下一个块正确对齐。在64位机器上,这意味着每次分配至少16字节(8字节保存大小,1字节保存字符,7字节填充以确保正确对齐)。
然而,很可能这不是存储的唯一数据;为了帮助内存分配器找到空闲内存,可能会存储额外的数据;如果假设数据由三个指针组成,则每次分配的总字节数为40字节,这与您的数据非常匹配。
还请注意,分配器也会从操作系统请求比实际分配所需更多的内存,因此它不需要为每一个小分配做一个昂贵的操作系统调用。也就是说,运行时库从操作系统中分配较大的内存块,然后将其分成较小的块用于程序的分配。因此,通常会从操作系统中分配一些内存(从而显示在任务管理器中),但尚未分配给程序中的某个对象。
- 为什么动态分配的内存总是16字节对齐
- 如何使用 new in C++ 分配字节数内存
- 动态分配 8 字节的内存
- 为什么 new 第一次分配 1040 个额外的字节?
- CopyMemory 复制的字节数比 VirtualAlloc 分配的字节多呢?
- 为什么分配的变量地址之间相差 16 个字节?
- Valgrind:将一个指针分配给另一个指针后丢失字节
- 如果Malloc无法分配X字节,我应该使用Realloc还是再次使用Malloc?C++
- 将分配的前 16 个字节的内存强制转换为 UDT
- 如何使用调用和分配指令在 llvm 字节码中查找类名
- 我正在尝试在类中动态分配静态字节板[67]
- 分配大小无效:4294967295 字节
- 无效的free() / delete / delete[] / realloc(), 4 字节在大小为 16 的块内分配
- c++堆分配默认为32字节对齐
- new分配了多少字节
- 为什么 2^80 字节的内存分配不会失败?
- C++强制 new[] 不分配 4 个额外的字节
- 通过取消引用指向字节数组的指针来分配值是错误的吗?
- C++ 分配期间 NaN 字节表示形式发生变化
- C++指针分配不起作用(关闭34个字节)