栈内的连续存储

3 篇文章 0 订阅
//在debug下
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct Strudent
{
	char name[20];
	int age;
	int score;	
}student;
int main()
{

	student s{};
	int a, b, c, d;
	a = 1;
	b = 2;
	c = 3;
	//d(4);//错误,编译器以为我们这个是个函数调用
	int e(5);//没问题,e这里相当于伪构造。

	int arr[10]{};

	return 0;
}

在这里插入图片描述

我们先来看数组,其分配的空间是连续的,正如平常我们所了解的。
但变量a,b,c,d,e 之间其分配是不连续的,都相差12个字节,与数组之间的差距更大。所以对于局部变量不能使用p+1来指向下一个局部变量。而对于数组我们可以使用偏移量来处理。

所以栈内空间的连续指的是数组、结构体等结构,而不是局部变量。而针对连续的数组和结构体,需要利用其内存连续特性来有效的进行内存管理(页)

在Debug模式下,int变量占用12个字节。可以这样认为,Debug模式下,在int变量的附近增加了8个字节,用于存储调试信息。当我们把模式设为Release,就会发现栈上连续定义的int变量,地址相差4个字节。注意:栈上地址从高向低增长。

在这里插入图片描述

void pass()//临时变量与形参相差16个个字节 4*4
{
	int x = 0;//都是差56*4   在relase版本下相差12*4 
	//*(&x + 56) = 456;
//	int z = 0;
}
int main()
{
	int y = 123;//两个栈内变量之间有12字节的空间 3*4  在relase是连续的
	//int y = 0;
	cout << y << endl;
	pass();
	cout << y << endl;

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值