C++对象模型学习笔记十六: 进程内存空间布局

知识点:

不同的数据在内存中会有不同的 保存时机,保存位置

当运行一个可执行文件时,操作系统就会把这个可执行文件加载到内存,形成进程,此时进程有一个虚拟的地址空间(内存空间)

linux有个nm命令:能够列出可执行文件中的全局变量存放的地址;

在这里插入图片描述

在这里插入图片描述

测试代码如下:

// 演示进程下内存分布
//

#include <iostream>
#include <time.h >
#include <stdio.h>
using namespace std;

int *ptest = new int(120); //堆
int g1; //bss 段
int g2;//bss 段

int g3 = 12; //数据段
int g4 = 32; //数据段
int g5;//bss 段
int g6 = 0;//bss 段
static int g7;//bss 段
static int g8 = 0; //bss 段
static int g9 = 10;//数据段

void mygfunc()
{
	return;
}

//定义一个类
class MYACLS
{
public:
	int m_i;
	static int m_si; //声明不是定义  静态成员不占用具体对象的内存空间 存储在程序的数据段中
	int m_j;
	static int m_sj;
	int m_k;
	static int m_sk;
	//static void myclsfunc() {}
};

int MYACLS::m_sj = 0; //这才是定义; //数据段

int main()
{
	int i = 7;;
	printf("i地址=%p\n", &i);
	//下面打印的是全局变量  这些全局变量原来是存放在可执行程序中的,多次加载到内存观察其内存位置都不变

	printf("ptest地址=%p\n", &ptest);
	printf("g1地址=%p\n", &g1);
	printf("g2地址=%p\n", &g2);
	printf("g3地址=%p\n", &g3);
	printf("g4地址=%p\n", &g4);
	printf("g5地址=%p\n", &g5);
	printf("g6地址=%p\n", &g6);
	printf("g7地址=%p\n", &g7);
	printf("g8地址=%p\n", &g8);
	printf("g9地址=%p\n", &g9);
	printf("MYACLS::m_sj地址=%p\n", &(MYACLS::m_sj));

	printf("mygfunc()地址=%p\n", mygfunc);
	printf("main()地址=%p\n", main);


	cout << (void*)mygfunc << endl;

	return 1;
}

运行结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值