C++内存分布探讨,x86和x64位的细微区别

网上在探讨C++内存分布的时候,大都是下面这种图,
外加上这么一句话:“栈区申请空间的地址(表示地址的八个十六进制数)是从大到小的,堆区申请空间地址是从小到大的。”
但是,小编编译器用x86和x64运行出结果恰好是相反的!

参考文章1:常规内存分布

《C/C++程序内存的分布》
在这里插入图片描述
在这里插入图片描述

参考文章2:栈堆地址高低次序测试1

《栈堆地址高低次序问题》

int main()
{
    
    
	printf("*************** 栈 ***************\n");
	int a;
	int b;
	printf("a=%x,b=%x\n", &a, &b);

	int d[10];
	for (int i = 0; i < 10; i++)
	{
    
    
		printf("d[%d]=%x\n", i, &d[i]);
	}

	printf("*************** 堆 ***************\n");
	int* c = new int;
	printf("c=%x\n", c);

	int* e = new int[10];
	for (int i = 0; i < 10; i++)
	{
    
    
		printf("e[%d]=%x\n", i, &e[i]);
	}

	//delete c, c = nullptr;
	int* f = new int;
	printf("f=%x\n", f);

	return 0;
}

32位测试结果

*************** 栈 ***************
a=f6fe70,b=f6fe64
d[0]=f6fe34
d[1]=f6fe38
d[2]=f6fe3c
d[3]=f6fe40
d[4]=f6fe44
d[5]=f6fe48
d[6]=f6fe4c
d[7]=f6fe50
d[8]=f6fe54
d[9]=f6fe58
*************** 堆 ***************
c=fd43f0
e[0]=fd9d60
e[1]=fd9d64
e[2]=fd9d68
e[3]=fd9d6c
e[4]=fd9d70
e[5]=fd9d74
e[6]=fd9d78
e[7]=fd9d7c
e[8]=fd9d80
e[9]=fd9d84
f=fd4420

64位测试结果

*************** 栈 ***************
a=c6d3f894,b=c6d3f8b4
d[0]=c6d3f8d8
d[1]=c6d3f8dc
d[2]=c6d3f8e0
d[3]=c6d3f8e4
d[4]=c6d3f8e8
d[5]=c6d3f8ec
d[6]=c6d3f8f0
d[7]=c6d3f8f4
d[8]=c6d3f8f8
d[9]=c6d3f8fc
*************** 堆 ***************
c=73d646a0
e[0]=73d72f70
e[1]=73d72f74
e[2]=73d72f78
e[3]=73d72f7c
e[4]=73d72f80
e[5]=73d72f84
e[6]=73d72f88
e[7]=73d72f8c
e[8]=73d72f90
e[9]=73d72f94
f=73d65d40

栈堆地址高低次序测试2

#include <iostream>
using namespace std;
//全局变量 未初始化
int g1;
int g2 = 0;
int g3 = 1;
int g4 = 2;
static int sg1 = 3;
int main(int argc, char* argv[])
{
    
    
    static int s1 = 5;
    cout << "memory address!" << endl;
    //代码区 .text
    cout << "代码区 main = " << main << endl;
    cout << "全局未初始化  g1=" << &g1 << endl;
    cout << "全局初始化为0 g2=" << &g2 << endl;
    cout << "全局初始化为1 g3=" << &g3 << endl;
    cout << "全局初始化为2 g4=" << &g4 << endl;
    cout << "静态全局初始化为3 sg1=" << &sg1 << endl;
    cout << "静态局部初始化为5 s1=" << &s1 << endl;
    int* p1 = new int;
    int* p2 = new int;
    cout << "堆空间地址 p1=" << p1 << endl;
    cout << "堆空间地址 p2=" << p2 << endl;
    cout << "指针变量的栈空间地址 &p1=" << &p1 << endl;
    cout << "指针变量的栈空间地址 &p2=" << &p2 << endl;
    int i1 = 100;
    int i2 = 101;
    cout << "栈空间地址 i1=" << &i1 << endl;
    cout << "栈空间地址 i2=" << &i2 << endl;
}

32位测试结果

memory address!
代码区 main = 00511267
全局未初始化  g1=0051C3E8
全局初始化为0 g2=0051C3EC
全局初始化为1 g3=0051C000
全局初始化为2 g4=0051C004
静态全局初始化为3 sg1=0051C008
静态局部初始化为5 s1=0051C010
堆空间地址 p1=01437670
堆空间地址 p2=01440AD8
指针变量的栈空间地址 &p1=00DFFDD0
指针变量的栈空间地址 &p2=00DFFDC4
栈空间地址 i1=00DFFDB8
栈空间地址 i2=00DFFDAC

64位测试结果

memory address!
代码区 main = 00007FF673F111E0
全局未初始化  g1=00007FF673F1F460
全局初始化为0 g2=00007FF673F1F464
全局初始化为1 g3=00007FF673F1F000
全局初始化为2 g4=00007FF673F1F004
静态全局初始化为3 sg1=00007FF673F1F008
静态局部初始化为5 s1=00007FF673F1F010
堆空间地址 p1=0000023D6104BDF0
堆空间地址 p2=0000023D6104AD80
指针变量的栈空间地址 &p1=000000F1E30FFA38
指针变量的栈空间地址 &p2=000000F1E30FFA58
栈空间地址 i1=000000F1E30FFA74
栈空间地址 i2=000000F1E30FFA94

猜你喜欢

转载自blog.csdn.net/haojie_duan/article/details/126772000