我的 8GB RAM 笔记本电脑上的内存是否超过 265GB?
Do I have more than 265GB memory on my 8GB RAM laptop?
我写了一个程序,分配内存,并计算最低地址和最高指针之间的大小。
我对结果感到惊讶。当我启动它时,它需要20mb的内存,40、60 ... 200、220、240,... 3000mb,3020mb,然后突然爆炸,262000 mb,等等。
有人可以解释一下为什么吗?
#include <iostream>
using namespace std;
int aaa;
int *max1=&aaa;
int *min1=&aaa;
void results(){
cout<<"min "<<min1<<endl;
cout<<"max "<<max1<<endl;
double mln= 1e6;
cout<<"min-max= "<<(max1-min1)/(1024*1024)<<"mb"<<endl;
}
void logic(int *c){
if(c>max1){
max1=c;
}
if(c<min1){
min1=c;
}
static int i;
i++;
if(i%800==0)
results();
}
int main(){
int *x;
int l=0;
while(l<=500000000){
l++;
x=new int[20000];
logic(&x[19999]);
}
}
比较(并因此减去)不指向同一数组元素的指针是没有意义的(双关语)。
你在对不相关的地址进行指针运算,结果有什么意义?
您不是在比较分配的同一块中的最低地址和最高地址,而是比较在 800 种不同的内存分配中看到的最低地址和最高地址。
考虑所有这些调用之间发生的所有堆碎片(以及可能的回收)。您的差值可能为正数、负数或零。
如果您要确定的是堆的范围,那么这种方法太随机了,因为您无法保证在 运行 内存不足之前找到最小和最大地址并崩溃。
还要考虑虚拟内存和分页的影响。通过虚拟内存的现代实现,理论上您可以访问您的进程可以访问的内存(我认为),而不管有多少 RAM(您实际安装了多少。
另请参阅:
Allocating more memory than there exists using malloc 和有关虚拟内存的评论中的 link。
您的程序正在使用 malloc() 分配内存。这从进程堆中获取内存。堆由一个或多个连续范围的预保留内存组成。每当您从堆中进行分配时,系统将使用和操作堆数据结构以在堆内为您提供所需大小的空闲范围,并根据需要为该范围分配物理内存页。当你分配大量内存时,你最终会消耗掉堆范围内的所有space。然后系统将保留一个新范围。但是新范围不一定就在旧范围之上,因为虚拟地址 space 可以分片,而且还有 ASLR(地址 Space 布局随机化)导致系统使用随机基在保留堆内存时,地址而不是遵循一致的算法。所以你甚至不能期望你的程序有一致的行为。
我写了一个程序,分配内存,并计算最低地址和最高指针之间的大小。 我对结果感到惊讶。当我启动它时,它需要20mb的内存,40、60 ... 200、220、240,... 3000mb,3020mb,然后突然爆炸,262000 mb,等等。 有人可以解释一下为什么吗?
#include <iostream>
using namespace std;
int aaa;
int *max1=&aaa;
int *min1=&aaa;
void results(){
cout<<"min "<<min1<<endl;
cout<<"max "<<max1<<endl;
double mln= 1e6;
cout<<"min-max= "<<(max1-min1)/(1024*1024)<<"mb"<<endl;
}
void logic(int *c){
if(c>max1){
max1=c;
}
if(c<min1){
min1=c;
}
static int i;
i++;
if(i%800==0)
results();
}
int main(){
int *x;
int l=0;
while(l<=500000000){
l++;
x=new int[20000];
logic(&x[19999]);
}
}
比较(并因此减去)不指向同一数组元素的指针是没有意义的(双关语)。
你在对不相关的地址进行指针运算,结果有什么意义?
您不是在比较分配的同一块中的最低地址和最高地址,而是比较在 800 种不同的内存分配中看到的最低地址和最高地址。
考虑所有这些调用之间发生的所有堆碎片(以及可能的回收)。您的差值可能为正数、负数或零。
如果您要确定的是堆的范围,那么这种方法太随机了,因为您无法保证在 运行 内存不足之前找到最小和最大地址并崩溃。
还要考虑虚拟内存和分页的影响。通过虚拟内存的现代实现,理论上您可以访问您的进程可以访问的内存(我认为),而不管有多少 RAM(您实际安装了多少。
另请参阅: Allocating more memory than there exists using malloc 和有关虚拟内存的评论中的 link。
您的程序正在使用 malloc() 分配内存。这从进程堆中获取内存。堆由一个或多个连续范围的预保留内存组成。每当您从堆中进行分配时,系统将使用和操作堆数据结构以在堆内为您提供所需大小的空闲范围,并根据需要为该范围分配物理内存页。当你分配大量内存时,你最终会消耗掉堆范围内的所有space。然后系统将保留一个新范围。但是新范围不一定就在旧范围之上,因为虚拟地址 space 可以分片,而且还有 ASLR(地址 Space 布局随机化)导致系统使用随机基在保留堆内存时,地址而不是遵循一致的算法。所以你甚至不能期望你的程序有一致的行为。