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

发布时间:2020-07-24 17:38:04 作者:牛鼓簧
来源:网络 阅读:4917

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

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


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



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

#include <stdio.h>

static int a;
int b;
int c = 1;

int main(void)
{
    return 0;
}

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

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

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

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

#include <stdio.h>

static int a;
int b = 1;
int c = 1;

int main(void)
{
    return 0;
}

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

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

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


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

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

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

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

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

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

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


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

b初始化为1:

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

b不初始化:

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


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

可能的原因是:

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

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


推荐阅读:
  1. C与C++数组输出的区别
  2. C#与C++的区别总结

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

内存

上一篇:Spring Message Converter

下一篇:SQL中访问远程数据库(MSSQL)

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》