初学者问题内存分配c ++
Beginner quesiton memory allocation c++
我目前正在学习 C++。在一些堆分配练习中,我试图生成错误的分配。我的物理内存大约是38GB。为什么可以分配这么大的内存?我的基本字节计算有误吗?我不明白。谁能给我一个提示吗?谢谢
#include <iostream>
int main(int argc, char **argv){
const size_t MAXLOOPS {1'000'000'000};
const size_t NUMINTS {2'000'000'000};
int* p_memory {nullptr};
std::cout << "Starting program heap_overflow.cpp" << std::endl;
std::cout << "Max Loops: " << MAXLOOPS << std::endl;
std::cout << "Number of Int per allocation: " << NUMINTS << std::endl;
for(size_t loop=0; loop<MAXLOOPS; ++loop){
std::cout << "Trying to allocate new heap in loop " << loop
<< ". current allocated mem = " << (NUMINTS * loop * sizeof(int))
<< " Bytes." << std::endl;
p_memory = new (std::nothrow) int[NUMINTS];
if (nullptr != p_memory)
std::cout << "Mem Allocation ok." << std::endl;
else {
std::cout << "Mem Allocation FAILED!." << std::endl;
break;
}
}
return 0;
}
输出:
...
Trying to allocate new heap in loop 17590. current allocated mem = 140720000000000 Bytes.
Mem Allocation ok.
Trying to allocate new heap in loop 17591. current allocated mem = 140728000000000 Bytes.
Mem Allocation FAILED!.
许多(但不是全部)支持虚拟内存的操作系统使用称为需求分页的概念 - 当您 分配 内存时,您执行簿记,允许您使用该记忆。但是,您当时并没有保留物理内存的实际页面。1
当您实际尝试读取或写入该分配内存页面中的任何字节时,会发生页面错误。错误处理程序检测到页面已被预分配但未按需调入。然后它会保留物理内存页面,并在将控制权返回给程序之前设置 PTE。
如果您尝试在每次分配后立即写入您分配的内存,您可能会发现 运行 物理内存用完的速度要快得多。
备注:
1 可以有一个 OS 支持虚拟内存但立即分配物理内存以支持虚拟分配的实现;虚拟内存是复制实验的必要条件,但不是充分条件。
一条评论提到交换到磁盘。这可能是一个转移注意力的问题——页面文件的大小通常与内存大小相当,总分配量约为 140 TB,这比单个磁盘大得多。对页面到磁盘的空的、未触及的页面也是无效的。
我目前正在学习 C++。在一些堆分配练习中,我试图生成错误的分配。我的物理内存大约是38GB。为什么可以分配这么大的内存?我的基本字节计算有误吗?我不明白。谁能给我一个提示吗?谢谢
#include <iostream>
int main(int argc, char **argv){
const size_t MAXLOOPS {1'000'000'000};
const size_t NUMINTS {2'000'000'000};
int* p_memory {nullptr};
std::cout << "Starting program heap_overflow.cpp" << std::endl;
std::cout << "Max Loops: " << MAXLOOPS << std::endl;
std::cout << "Number of Int per allocation: " << NUMINTS << std::endl;
for(size_t loop=0; loop<MAXLOOPS; ++loop){
std::cout << "Trying to allocate new heap in loop " << loop
<< ". current allocated mem = " << (NUMINTS * loop * sizeof(int))
<< " Bytes." << std::endl;
p_memory = new (std::nothrow) int[NUMINTS];
if (nullptr != p_memory)
std::cout << "Mem Allocation ok." << std::endl;
else {
std::cout << "Mem Allocation FAILED!." << std::endl;
break;
}
}
return 0;
}
输出:
...
Trying to allocate new heap in loop 17590. current allocated mem = 140720000000000 Bytes.
Mem Allocation ok.
Trying to allocate new heap in loop 17591. current allocated mem = 140728000000000 Bytes.
Mem Allocation FAILED!.
许多(但不是全部)支持虚拟内存的操作系统使用称为需求分页的概念 - 当您 分配 内存时,您执行簿记,允许您使用该记忆。但是,您当时并没有保留物理内存的实际页面。1
当您实际尝试读取或写入该分配内存页面中的任何字节时,会发生页面错误。错误处理程序检测到页面已被预分配但未按需调入。然后它会保留物理内存页面,并在将控制权返回给程序之前设置 PTE。
如果您尝试在每次分配后立即写入您分配的内存,您可能会发现 运行 物理内存用完的速度要快得多。
备注:
1 可以有一个 OS 支持虚拟内存但立即分配物理内存以支持虚拟分配的实现;虚拟内存是复制实验的必要条件,但不是充分条件。
一条评论提到交换到磁盘。这可能是一个转移注意力的问题——页面文件的大小通常与内存大小相当,总分配量约为 140 TB,这比单个磁盘大得多。对页面到磁盘的空的、未触及的页面也是无效的。