美文网首页
C++内存模型

C++内存模型

作者: 曹小恒 | 来源:发表于2018-04-07 16:43 被阅读0次

在讲述内存模型的时候,我们使用下面这段代码来涵盖各种内存分配的情况

#include<iostream>

using namespace std;

const double pi=3.1415926;    //常量

static int out=0;    //静态全局变量

int i=1;    //初始化了的全局变量

int j;    //未初始化的全局变量

void func1()
{
    static int count;    //静态局部变量

    count++;

    int i=count % 10;    //局部变量

    cout<<"count % 10="<<i<<endl;    //"count % 10="为字符串常量
}

void func2()
{
    int i=0;    //局部变量

    int *pi=&i;    //局部变量

    *pi=*pi+1;

    cout<<"i="<<i<<endl;    //"i="为字符串常量
}

int main()
{
    static int out=2;    //静态局部变量

    cout<<"out="<out<<endl;

    func1();

    func2();

    return 0;
}

这是内存变量图:

图片.png
对于一个 C++程序,它的内存模型分成这样几个区域, text,rodata,data,bss,heap,stack和命令行参数(环境变量)
  • rodata 和 text 在同一个段内,称为常量区,只能读,不能写
  • data 和bss会在同一个段内,称为全局区,可读可写

rodata
read only data, 上述程序中的pi和常量字符串count % 10在这个区域

text
保存编译连接后生成的机器代码,调用函数后加载到栈中执行.

这两个区域称为静态区,只能读不能改.

data
存放已经初始化的全局变量和声明为 static 的局部变量,

static int out=0;    //静态全局变量
int i=1;    //初始化了的全局变量

static int out = 2;    //静态局部变量

这三个, 已经初始化的全局变量和局部变量会存放在 data区,这里有两个 out, 编译器不会混淆他们的.

bss
block started by symbol.
存储没有初始化的全局变量和 static 的局部变量, 默认先赋值为0(数值)或者 NULL(指针),上文中的

int j;    //未初始化的全局变量
static int count;    //静态局部变量

都是典型

区分已经初始化和没有初始化的原因是为了节省空间,
在目标文件中, bss 中的变量不占有空间,只保存了他们运行时要占空间的大小,运行时开辟,全部置为0.

data 和 bss 保存的是全局变量和静态局部变量,在程序启动的时候,他们被放入全局区,可读可写

heap
分配动态内存,比如 newmalloc内存管理由用户来解决
容易碎片化
一般不会溢出

stack
保存参数和函数内声明的非static 局部变量.
大小有限,容易溢出.

相关文章

  • 2018-11-11 #C++ 内存模型#

    C++ 原子操作内存模型 C++ 原子操作内存模型解决并发编程的什么问题? 相信在大多数应用程序员眼里,代码在编辑...

  • C++内存模型

    在讲述内存模型的时候,我们使用下面这段代码来涵盖各种内存分配的情况 这是内存变量图: rodata 和 text ...

  • C++内存模型

    普通成员函数存储方式 C++程序的内存格局通常分为四个区:全局数据区(data area),代码区(code ar...

  • C++内存模型

    内存模型是多线程环境能够可靠工作的基础,因为内存模型需要对多线程环境的运作细节进行完备的定义。 内存模型通过共享数...

  • C++_day06

    C++核心编程 主要针对C++面向对象编程技术做详细讲解,探讨C++中的核心和精髓 1. 内存分区模型 C++程序...

  • NDK学习 之 Java对象映射C++对象

    背景 我们都知道Java内存模型和C++内存模型不同,而且是分开存储和管理的。做NDK开发的小伙伴经常遇到这样一个...

  • 开篇2:C/C++ 内存布局与程序栈

    如果你对C/C++基本数据类型的内存模型没概念的话,可以先查看该传送门《开篇1:C/C++ 内存中的数据表示》,反...

  • C++11 Memory Model

    Herb Sutter在一次对C++11内存模型的演讲中提到C++11的内存模型,让C++有了标准独立于编译器和平...

  • C++ 对象内存模型

    (很久之前写的了,先扔上来 继承 (无虚函数时) 单继承 类的对象的内存布局如下所示: 类中的成员变量的存储顺序从...

  • C++内存分区模型

    内存分区模型 C++程序在执行时,将程序大方向划分为4个区域 代码区:存放函数体的二进制代码,由操作系统进行管理的...

网友评论

      本文标题:C++内存模型

      本文链接:https://www.haomeiwen.com/subject/nryyhftx.html