++i与i++在底层的区别分析_第1页
++i与i++在底层的区别分析_第2页
++i与i++在底层的区别分析_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

i 与 i 在底层的区别分析 1 计算机中应用程序应用程序 Application 的内存布局 在我们学习编程语言的过程中熟练掌握自己编写的程序的内存布局是十分重要的 掌 握了内存就掌握了一切 我们知道我们编写的程序 源代码 要经过编译器 compiler 的编译才可以变成能够在计算机上执行的程序 C 是 exe 可执行文件 Java 中是编译成 字节码 class 文件才能在虚拟计算机 虚拟计算机 JWM 上运行 鉴于此我们就知道编译器为我们 的程序编制做了大量的工作 但是却隐藏了从源程序到目标程序转换的过程 很多时候就 会出现许多的困惑 所以我建议大家不要死抠编程语言的语法规则 而是要试着从内存的 角度分析程序的运行 在这里主要使用 VC 的 VS2010 强大的调试功能分析一下基本原理 首先 我们需要知道程序运行要使用的 4 大内存区域 代码段 code segment 数据 段 data segment 堆栈 stack 堆 heap 他们的作用分别如下 1 代码段 code segment 存储程序运行的代码 2 数据段 data segment Java 中的字符串常量 静态变量 使用 static 关键字修饰 的 3 堆栈 stack 局部变量 4 堆 heap Java 中使用 new 关键字申请的 注意 在 Java 中除了基础数据类型中的 4 类 8 种数据类型 其他的数据类型就是引用 类型 类 接口 数组 需要引起注意的是如下的 Java 语句 int score 89 79 76 静态初始化数组 有过 C 编程经验的程序员知道它在线程堆栈中分配 然而在 Java 中数组作为引 用数据类型它会占用两块内存 如下所示 图 1 一维基础数据类型数组内存结构 之所以我们在 Java 的语法书上看到上面的那一句 int 型静态初始化数组等价于 int score new int 89 79 76 是因为我们写的 int score 89 79 76 Java 编译器会做类似上面的替换 而实 际中的内存布局依然是上面那样的 如果想打好 Java 的基础建议观看马士兵主讲的 Java 基础 尤其是里面的内存分析是 最为精辟的 2 i 与 i 在底层的区别分析 问题的引出 C 代码截图 图 2 C 中的代码实现 程序运行情况 图 3 C 中的代码实现运行结果 在图 2 的断点处 和 同样都是对 i 进行赋值但是 i 的结果却不一样 为什么了 如果我们仅仅从语法上讲大家不是很明白但是我们从汇编的角度来考虑就豁然开朗了 图4 i i2 对应的汇编 i i2 的反汇编代码分析 004141D3 将dword ptr i2 即i2中的内存单元 中的数据拷贝到eax寄存器中 004141D6 将eax寄存器中的数据 即i2 拷贝到dword ptr i 即i的内存单元 中 004141D9 将dword ptr i2 即i2中的内存单元 中的数据拷贝到ecx寄存器中 004141DC 将ecx寄存器中的内容自增自增1 004141DF 将ecx寄存器中的内容 ecx加1后的数据 拷贝到dword ptr i2 图5 i i2 对应的汇编 i i2 的反汇编代码分析 00414259 将dword ptr i2 即i2中的内存单元 中的数据拷贝到eax寄存器中 0041425C 将eax寄存器中的内容自增1 0041425F 将eax寄存器中的内容 eax加1后的数据 拷贝到dword ptr i2 即i2中的 内存单元 00414162 将dword ptr i2 即i2中的内存单元 中的数据拷贝到ecx寄存器中 00414265

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论