关于C/C++有哪几个分区以及自由存储区和堆的区别

您所在的位置:网站首页 mac内存和存储空间的区别在哪 关于C/C++有哪几个分区以及自由存储区和堆的区别

关于C/C++有哪几个分区以及自由存储区和堆的区别

2024-07-11 19:55| 来源: 网络整理| 查看: 265

2020年7月15日 周三 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】

本文标题 一、网上搜索C++分区,会发现有两种不同的答案二、查阅了一些资料,其中一个观点如下内存一共4个区:1. 任何在函数内部声明的非static变量,其变量地址本身在栈区2. 任何全局变量或者静态局部变量,其变量地址本身在全局区3. 任何指针变量 如果用malloc,realloc,calloc,或者c++中的new,指针指向的内存在堆区4. 代码、字面常量在代码区 总结 三、自由存储区和堆的区别总结 参考文献

一、网上搜索C++分区,会发现有两种不同的答案 在C/C++中,内存分成5个区,他们分别是堆、栈、全局/静态存储区、自由存储区和常量存储区。一个由C/C++编译的程序占用的内存分为以下几个部分——堆,栈,全局/静态存储区,文字常量区,程序代码区。

这两种说法除了共同的 堆、栈、全局/静态存储区 之外,第一种说法认为还有自由存储区和常量存储区,而第二种认为还有文字常量区,程序代码区。

二、查阅了一些资料,其中一个观点如下 内存一共4个区: 1. 任何在函数内部声明的非static变量,其变量地址本身在栈区 2. 任何全局变量或者静态局部变量,其变量地址本身在全局区 3. 任何指针变量 如果用malloc,realloc,calloc,或者c++中的new,指针指向的内存在堆区 4. 代码、字面常量在代码区 总结

实际上分成4个区就行了——堆,栈,全局/静态存储区,代码区(包括了代码区和文字常量区),如果非要分成5个区,请把代码和字面常量分开 。所以第二种分法—— 堆,栈,全局/静态存储区,文字常量区,程序代码区 勉强算是正确。其实研究这个意义不大,因为不同的编译器可能会有不同的行为。 示例代码:

#include #include int a = 1234; //全局区 int main() { char *b = "Hello"; //指针指向代码区,b变量本身也在栈区 int c = 5678; //栈区 int *d = (int*)malloc( sizeof(int) ); //指针指向堆区,d变量本身同样在栈区 *d = 9999; static char e = 0; //全局区 static int (*f)() = main; //指向代码区,f本身在全局区 printf( "&a = %08x, a = %d\n", &a, a ); printf( " b = %08x, b = %s, &b = %08x\n", b, b, &b ); printf( "&c = %08x, c = %d\n", &c, c ); printf( " d = %08x, *d = %d, &d = %08x\n", &d, *d, &d ); printf( "&e = %08x, e = %d\n", &e, e ); printf( "&f = %08x, f = %d\n", &f, f ); printf( "&main = %08x, main = %d\n", &main, main ); return 0; } 三、自由存储区和堆的区别 从技术上来说,堆(heap)是 C/C++ 语言和操作系统的术语,堆是操作系统所维护的一块特殊内存,它提供了动态分配的功能,使用malloc()、free() 来申请/释放内存。自由存储是 C++ 中通过 new 和 delete 动态分配和释放对象的抽象概念。基本上,所有的 C++ 编译器默认使用堆来实现自由存储。也就是说,默认的全局运算符 new 和 delete 也许会使用 malloc 和free 的方式申请和释放存储空间,这时自由存储区就位于堆上。但程序员也可以通过重载操作符,改用其他内存来实现自由存储,例如全局变量做的对象池,这时自由存储区就不位于堆上了。 总结

因此,自由存储区和堆的区别是:堆是操作系统维护的一块内存,是一个物理概念,而自由存储是C++中通过new与delete动态分配和释放的对象的存储区,是一个逻辑概念。堆与自由存储区并不等价。

参考文献

https://bbs.csdn.net/topics/390149260 https://www.cnblogs.com/QG-whz/p/5060894.html https://blog.csdn.net/nie19940803/article/details/76325082



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3