最近在做校招面试题,关于内存分配的问题整理如下。
C/C++编译程序内存分配
动态存储区
- 栈区
局部变量区,由编译器自动分配释放,存放函数的参数值,局部变量的值等。 - 堆区
动态存储区,malloc 申请的变量,手动申请,手动释放。
使用malloc或者new进行堆的申请,堆的总大小为机器的虚拟内存的大小。
new和malloc的区别如下:
(1)malloc是C语言中的函数,而new是C++中的操作符。
(2)malloc申请之后返回的类型是void*,而new返回的指针带有类型。
(3)malloc只负责内存的分配而不会调用类的构造函数,而new不仅会分配内存,而且会自动调用类的构造函数。
静态存储区
静态存储区内变量在程序编译阶段已经分配好内存空间并初始化。这块内存在程序的整个运行期间都存在,它主要存放静态变量(static)、全局变量(global)和常量。
Tips:
(1)静态存储区内不存在未初始化的变量,编译器会以默认的方式进行初始化。
(2)静态存储区内的常量分为常变量和字符串常量,一经初始化,不可修改。
静态存储内的常变量是全局变量,与局部常变量不同,区别在于局部常变量存放于栈,实际可间接通过指针或者引用进行修改,而全局常变量存放于静态常量区则不可以间接修改。
(3)字符串常量存储在静态存储区的常量区,字符串常量的名称即为它本身,属于常变量。
代码区
存放程序体的二进制代码。
参考网上的示例代码
int a=0; //全局初始化区
char *p1; //全局未初始化区
main()
{
int b;栈
char s[]="abc"; //栈
char *p2; //栈
char *p3="123456"; //123456\0在常量区,p3在栈上。
static int c=0; //全局(静态)初始化区
p1 = (char*)malloc(10);
p2 = (char*)malloc(20); //分配得来得10和20字节的区域就在堆区。
strcpy(p1,"123456");
//123456\0放在常量区,编译器可能会将它与p3所向"123456"优化成一个地方。
}
栈&堆申请效率比较
栈:由系统自动分配,速度较快。但程序员是无法控制的。
堆:是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,但便于使用。
未完待续……