网上在探讨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;//代码区 .textcout << "代码区 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

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

  1. x86、x64和ia64的区别

    x86或80x86是英特尔Intel首先开发制造的一种微处理器体系结构的泛称.该系列较早期的处理器名称是以数字来表示,并以"86"作为结尾,包括Intel 8086.80186.8 ...

  2. 简单归纳一下32位、64位、x86、x64的区别和联系

    32位.64位.x86.x64区别和联系 一切都要从1978年说起,英特尔在这年发布了世界上第一款 x86 指令集架构的处理器「Intel 8086」. 之后这个系列的处理器名称都以数字 86 作为结 ...

  3. x86、x64、x32和64位、32位的区别与联系

    x86代表32位系统:x64代表64位系统64位就是最近两年才出的新一代的CPU,一般适用于专业的大型的计算,没有32位应用广泛.64位不仅对硬件要求高,而且很多软件都不兼容.x86是一个intel通 ...

  4. x86、x64、32位和64位

    x86是x86-32的缩写,x64是x86-64的缩写,这样就可以理解了x86就是32位,x64就是64位. x86.x64是一套指令集,主要是指系统对CPU GPRs的数据传输时的数据宽度不同,分别 ...

  5. [分享]Win7 32位与64位/x86与x64的区别

    看到有很多会员问到底是选Windows7 x86,还是选x64.这里简单的谈一下这这两种 系统 的区别. 简单的说x86代表32位操作系统  x64代表64位操作系统. 如果你的 CPU 是双核以上, ...

  6. 如何检查Windows Vista , XP和2003系统是32位或64位( x86或x64 )版本

    您可能会收到一个电脑作为礼物,以及想要找出系统是否设置了一个32位或64位(微软标签,他们作为x86或x64 )为基础的作业系统,这需要特别建造的应用软件. ) . For computer or P ...

  7. 模块XXXX可能与您正在运行的Windows版本不兼容。检查该模块是否与regsvr32.exe的x86(32位)x64(64位)版本兼容。

    最近自己在编写ActiveX控件.遇到的麻烦事不少. 今天遇到了这个问题"模块XXXX可能与您正在运行的Windows版本不兼容.检查该模块是否与regsvr32.exe的x86(32位)x ...

  8. 【Linux 内核 内存管理】Linux 内核内存布局 ④ ( ARM64 架构体系内存分布 | 内核启动源码 start_kernel | 内存初始化 mm_init | mem_init )

    文章目录 一.ARM64 架构体系内存分布 二.Linux 内核启动源码 start_kernel 三.内存初始化源码 mm_init 四.内存初始化源码 mem_init 一.ARM64 架构体系内 ...

  9. x86和x64的意义

    问题:究竟在VS下,应用程序是编译为x86还是x64呢? 转载内容如下: 一)64位系统和32位有什么区别? 1.64bit CPU拥有更大的寻址能力,最大支持到16GB内存,而32bit只支持4G内 ...

最新文章

  1. Sublime Text 2/3 配置文件详解
  2. 阿里巴巴公布“云钉一体”战略:阿里云与钉钉全面融合
  3. mysql 万亿数据_sql-server – 哪个数据库可以处理数十亿/数万亿条记录的存储?...
  4. Java Review - LinkedHashMap LinkedHashSet 源码解读
  5. [官方教程] [ES4封装教程]1.使用 VMware Player 创建适合封装的虚拟机
  6. pythonmsgbox怎么使用_如何使用tkinter的messagebox
  7. 解释器和编译器的区别
  8. python实现redis分布式锁
  9. 小翔和泰拉瑞亚(线段树+思维)
  10. Android清单AndroidManifest详细说明
  11. 介绍神经网络_神经网络介绍
  12. 使用ASP.NET广告控件的XML语言创建广告链接--ASP.NET
  13. Use Vim as a Python IDE
  14. 【Python】mayavi小结
  15. linux取消头文件链接,【原创】Linux下编译链接中常见问题总结
  16. java字符如何向float转换_java – 将float转换为字符串分数表示
  17. 京东黑科技引爆车联网时代 你的爱车升级了吗?
  18. 兼容ie\firefox\chrome的cursor
  19. python学习手册笔记——29.运算符重载
  20. 自带CA ,sha256 哈希签名,2048 位加密 脚本,通用

热门文章

  1. 这是新技术时代来临,却始终都无法打开局面的“紧箍咒”
  2. VS 2017生成exe(msi)文件
  3. 仅用 CSS 实现赛博朋克 2077 风格视觉效果
  4. 计算机知识中Q是啥意思,物理电学中Q和q分别代表什么意思,初中物理电学的所有知识点,要全面!...
  5. [转] 明年,你还爱我吗?
  6. python pika 消费mq basic_get方法
  7. 【图像隐藏】基于小波变换+SURF、RANSAC、LT码、CRC(循环冗余检验)码多种算法实现图像隐藏(抗多种攻击)matlab源码
  8. 考研英语(一、二)应用文(小作文)写作模板—中公考研
  9. 算法导论 chapter4
  10. IDE新建gradle liferay workspace项目没有项目目录问题解决方案