C与C++的内存机制的比较

简介:

C语言与C++内存非常相似,这也是我一直搞不清楚他的原因;下面梳理一下他们之间的区别:

  1、先说C语言的内存机制

    • 栈        位于函数内的局部变量(包括函数实参),由编译器负责分配和释放,函数结束,栈变量失效;

    • 堆        由程序员用malloc()/calloc()/realloc()分配空间,free()释放所申请的空间。如果程序员忘记free(),则会造成内存泄漏,程序结束时可能会由操作系统回收,也许就一直占用着直至关机。

    • 全局区/静态区        全局变量和静态变量存放区,程序一经编译好,该区域便存在。并且在C语言中初始化的全局变量和静态变量和未初始化的放在相邻的两个区域在C++中,由于编译器会给全局变量和静态变量自动初始化赋值,所以没有区分了)。由于全局变量一直占据内存空间且不易维护,推荐少用。程序结束时释放。 

    • C风格字符串常量存储区        专门存放字符串常量的地方,程序结束时释放;

    • 程序代码区         存放程序二进制代码的区域。


  2、再说C++的内存机制

    • 栈        位于函数内的局部变量(包括函数实参),由编译器负责分配释放,函数结束,栈变量失效。

    • 堆        这里与C不同的是,该堆是由new申请的内存,由delete负责释放。

    • 自由存储区        由程序员用malloc()/calloc()/realloc()分配空间,由free()释放。如果程序员忘记free()了,则会造成内存泄漏,程序结束时可能会有操作系统回收,也许就一直占用着直至关机。 与C的堆机制对应。

    • 全局区/静态区        全局变量和静态变量存放区,程序一经编译好,该区域便存在。在C++中,由于编译器会给全局变量和静态变量自动初始化赋值,所以没有区分初始化和未初始化变量。由于全局变量一直占据内存空间且不易维护,推荐少用。程序结束时释放。

    • 常量存储区        这是一块比较特殊的存储区,专门存储不能修改的常量(如果采用非正常手段更改,当然也是可以的)。



下面举个栗子,比较C与C++在全局区/静态区的区别(Linux):

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
static  int  a;
int  b;
int  c = 1;
 
int  main( void )
{
     return  0;
}

将文件编译成可执行文件,打印文件的大小:

1.PNG

可以看到,数据段(data,不包括bss)为252,bss(未初始化数据段)为16;

接下来将测试代码进行修改(对b进行初始化):

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
static  int  a;
int  b = 1;
int  c = 1;
 
int  main( void )
{
     return  0;
}

将文件编译成可执行文件,打印文件的大小:

2.PNG

可以看到,数据段(data,不包括bss)为256(252+4),bss(未初始化数据段)为12(16-4);


与上面的那段代码对比可以发现,data增加了4,刚刚好是bss减少的4。现在,就可以确定C语言中,对全局区/静态区中变量初始化与为初始化是放在不同区域的。

接下来看一下C++运行的结果:

b未手动初始化(int b;):

3.PNG

b手动初始化为0(int b = 0):

5.PNG

上面在C++下面,数据段(data)没有变化;因此在c语言中,全局变量又分为初始化的和未初始化的,在c++里面没有这个区分了,他们共同占用同一块内存区。


但是,这里面有一个非常小的细节对于b的初始化,如果手动初始化为0以外的数字,打印出来的data段又与C语言是一样的:

b初始化为1:

8.PNG

b不初始化:

7.PNG


以上问题的出现,是什么原因,还没有查清楚。

可能的原因是:

BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。(0也算未初始化)
数据段(data segment)通常是指用来存放程序中已初始化且不为0的全局变量的一块内存区域。(只有初始化为0之外的数字才算真正的初始化)

具体原因不知道,只是猜测。



本文转自 七十七快 51CTO博客,原文链接:http://blog.51cto.com/10324228/2083826

相关文章
|
15天前
|
Java C#
深入理解操作系统的内存管理机制
【4月更文挑战第25天】 在现代计算机系统中,操作系统扮演着关键的角色,它负责协调和管理硬件资源,确保系统运行的稳定性和效率。内存管理是操作系统中的核心职能之一,它涉及到物理内存的分配、虚拟内存的管理以及内存的优化等复杂过程。本文将深入探讨操作系统的内存管理机制,包括分页系统的实现原理、地址转换机制以及内存碎片问题的解决策略。通过对这些概念和技术的详细分析,读者将能够更好地理解操作系统如何高效地管理和利用计算机的内存资源。
|
10天前
|
算法
深入理解操作系统的内存管理机制
【4月更文挑战第30天】 在现代计算机系统中,操作系统扮演着至关重要的角色,它负责协调和管理硬件资源,确保系统高效、稳定地运行。其中,内存管理是操作系统的核心功能之一,涉及到物理内存的分配、虚拟内存的映射以及内存的优化等多个方面。本文将深入探讨操作系统中的内存管理机制,包括分页、分段和段页式结合等技术,旨在为读者提供一个清晰的内存管理框架视图,并解释这些技术如何提高系统的性能和稳定性。
|
13天前
|
算法 Java 大数据
深入理解操作系统的内存管理机制
【4月更文挑战第27天】 在现代计算机系统中,操作系统扮演着至关重要的角色,尤其是内存管理作为其核心功能之一,它直接关系到系统性能和稳定性。本文将探讨操作系统中内存管理的基本原理、关键技术以及面临的挑战,旨在为读者提供一个清晰的内存管理概念框架,并通过分析不同内存管理策略的优缺点,揭示其对操作系统整体性能的影响。
|
13天前
|
缓存 算法 调度
深入理解操作系统的内存管理机制
【4月更文挑战第27天】 在现代计算机系统中,操作系统扮演着至关重要的角色,尤其在资源管理和调度方面。内存管理是操作系统的核心功能之一,它负责分配、跟踪和回收应用程序使用的物理内存。本文将探讨操作系统如何通过不同的内存管理技术来优化内存使用效率,包括分页、分段以及虚拟内存等概念。通过对这些技术的深入分析,读者将获得对操作系统内部工作原理的更深刻理解,并了解它们如何影响应用程序性能和系统稳定性。
|
1天前
|
存储 编译器 C语言
C++中的内存管理
C++中的内存管理
11 0
|
1天前
|
算法 程序员 调度
深入理解操作系统的内存管理机制
【5月更文挑战第9天】 在现代计算机系统中,操作系统的内存管理是一个至关重要的部分,它直接影响到系统的性能和稳定性。本文将深入探讨操作系统的内存管理机制,包括物理内存的管理、虚拟内存的概念和应用,以及内存分配和回收的策略。通过对这些内容的深入理解,我们可以更好地理解操作系统的工作原理,提高我们的编程效率和质量。
|
1天前
|
算法 安全 UED
深入理解操作系统的内存管理机制
【5月更文挑战第9天】 在本文中,我们将探讨操作系统的核心组件之一——内存管理。不同于传统的摘要概述,我们将直接切入主题,首先介绍内存管理的基础知识,然后深入讨论操作系统如何处理内存分配、内存保护以及虚拟内存技术。通过分析具体实例和案例研究,文章旨在为读者提供一个清晰的框架,以理解内存管理在现代操作系统中的实现和重要性。
2 0
|
1天前
|
存储 内存技术
深入理解操作系统的内存管理机制
【5月更文挑战第9天】操作系统的内存管理机制是计算机科学中的核心概念,它负责协调和管理计算机的内存资源,确保系统的稳定性和效率。本文将深入探讨操作系统的内存管理机制,包括内存分配、内存保护和虚拟内存等关键技术,帮助读者更好地理解和掌握操作系统的运行原理。
|
2天前
|
存储 Linux C语言
【C++从练气到飞升】07---内存管理
【C++从练气到飞升】07---内存管理
|
4天前
|
存储 编译器 C++
【C++】内存管理和模板基础(new、delete、类及函数模板)
【C++】内存管理和模板基础(new、delete、类及函数模板)
19 1