gpt4 book ai didi

c++ - 可以在c++中动态和在编译时分配的最大内存

转载 作者:可可西里 更新时间:2023-11-01 17:38:16 26 4
gpt4 key购买 nike

我正在尝试了解可以分配多少内存。最初我认为可以分配的最大内存等于物理内存(RAM)。我通过运行如下所示的命令检查了 Ubuntu 12.04 上的 RAM:

~$ free -b
total used free shared buffers cached
Mem: 3170848768 2526740480 644108288 0 265547776 1360060416
-/+ buffers/cache: 901132288 2269716480
Swap: 2428497920 0 2428497920

如上所示,总物理内存为 3Gig(3170848768 字节),其中只有 644108288 字节是空闲的,所以我假设我最多只能分配这么多内存。我通过编写下面只有两行的小程序来测试它:

char * p1 = new char[644108290] ;
delete p1;

由于代码运行完美,这意味着它成功分配了内存。我也尝试分配大于可用物理空闲内存的内存,但它没有抛出任何错误。然后每个问题

maximum memory which malloc can allocate

我认为它一定是在使用虚拟内存。所以我测试了空闲交换内存的代码,它也有效。

char * p1 = new char[2428497920] ;
delete p1;

我尝试分配空闲交换空间加上空闲 RAM 字节的内存

char * p1 = new char[3072606208] ;
delete p1;

但是这次代码没有抛出bad_alloc异常。为什么这次代码没有运行。

现在我在一个新程序中在编译时分配了内存,如下所示:

char p[3072606208] ;
char p2[4072606208] ;
char p3[5072606208];
cout<<"Size of array p = " <<sizeof p <<endl;
cout<<"Size of array p2 = " <<sizeof p2<<endl;
cout<<"Size of array p2 = " <<sizeof p3;

输出显示

Size of array p = 3072606208
Size of array p1 = 4072606208
Size of array p2 = 777638912

你能帮我理解这里发生了什么吗?为什么它允许在编译时分配内存而不是动态分配内存。在分配编译时间时,pp1 为何能够分配大于交换空间的内存加上空闲 RAM 内存。 p2 失败的地方。这究竟是如何工作的。这是一些未定义的行为还是特定于操作系统的行为。谢谢你的帮助。我正在使用 Ubuntu 12.04 和 gcc 4.6.3。

最佳答案

在您使用内存页之前,它们实际上并没有映射到您的程序。 malloc 所做的只是保留一个范围的虚拟地址空间。在您尝试读取或写入这些虚拟页面之前,不会将物理 RAM 映射到它们。

即使您分配全局或堆栈(“自动”)内存,在您触摸它们之前也不会映射物理页面。

最后,sizeof() 在编译时被评估,此时编译器不知道操作系统稍后会做什么。所以它只会告诉您对象的预期大小。

如果您在每种情况下都尝试将内存memset 设置为0,您会发现事情的表现会大不相同。此外,您可能想尝试 calloc,它将其内存清零。

关于c++ - 可以在c++中动态和在编译时分配的最大内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13074689/

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