//在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;
}