malloc 出的地址最小为多少?
不知道有没有这样的标准规定,malloc 出的指针有什么限定范围?不知这属于 C/C++ 标准还是 OS 系统方面的?
提此问的背景如下:
对于大整数来说,我们只要保存非零数据即可,尾部的连续零无须占用实际的空间。
一般的做法是单独用一个变量记录尾部连续零的数目。
现在我想换一种思路:设一个虚拟的“原点”指针,它相当于大整数的小数点位置,
对于移位运算来说,我单单只要将这个虚拟的“原点”指针反向偏移即可。
比如说,若想将大整数“左移”k“位”,那么我们只要将这个“虚拟的指针 -= k”即可。
关键是:不希望此过程中出现运算溢出的情况。因为指针间存在比较大小的运算。 标准C/C++应该除了要求分配的指针值不等于NULL以外没有额外的要求。
此外,我们对malloc返回的指针还有一个对齐要求,比如现在的操作系统里面通常返回的地址值是8的倍数。
另外在Windows下,好像返回的地址值不会小于$10^6$ 一、在 C 中分为这几个存储区
[*] 栈 - 由编译器自动分配释放
[*] 堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
[*] 全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束释放
[*] 另外还有一个专门放常量的地方。- 程序结束释放
二、在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区
[*] 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
[*] 堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
[*] 自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
[*] 全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
[*] 常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改)
可以用下面的程序片段查询系统信息:SYSTEM_INFO sysInfo;
GetSystemInfo(&sysInfo);
cout<<"机器属性:"<<endl;
cout<<"页大小="<<sysInfo.dwPageSize<<endl;
cout<<"分配粒度="<<sysInfo.dwAllocationGranularity<<endl;
cout<<"用户区最小值="<<sysInfo.lpMinimumApplicationAddress<<endl;
cout<<"用户区最大值="<<sysInfo.lpMaximumApplicationAddress<<endl<<endl;在32位下的 windows 进程独享用户分区范围为:0x0001 0000~0x7FFE FFFF
也就是说,最小值可以为 0x0001 0000 = 65536,
这个值太小了,看来新的想法有局限性。 如果你真想限制最小指针地址,可以在程序中将那些小的地址保留(通过VirtualAlloc函数)
页:
[1]