
C/C++内存布局
Neo_Wu
这个作者很懒,什么都没留下…
展开
-
C++内存管理详解
1、内存分配方式内存分配方式有三种:(1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。(2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。(3) 从堆上分配,亦原创 2013-03-02 23:57:01 · 525 阅读 · 0 评论 -
C++ 对象的内存布局(下)
C++ 对象的内存布局(下) 陈皓http://blog.youkuaiyun.com/haoel <<<点击这里查看上篇 重复继承 下面我们再来看看,发生重复继承的情况。所谓重复继承,也就是某个基类被间接地重复继承了多次。 下图是一个继承图,我们重载了父类的f()函数。 其类继承的源代码如下所示。其中,每个类都有两个变量,一个是整形(4字节转载 2013-03-30 13:34:45 · 720 阅读 · 0 评论 -
Rational Purify 使用及分析实例
Rational Purify 使用及分析实例蔡 林, IBM 中国软件开发中心软件工程师简介: 本文介绍了 IBM Rational Purify的基本概念和在不同操作系统中使用Purify对C/C++源程序中存在的内存问题进行勘察和分析,并且提供了有关的实例以便读者在实际操作中作为参考。发布日期: 2006 年 2 月 23 日 级别转载 2013-10-20 19:10:30 · 1171 阅读 · 0 评论 -
C/C++ Memory Layout
为什么需要知道C/C++的内存布局和在哪可以可以找到想要的数据?知道内存布局对调试程序非常有帮助,可以知道程序执行时,到底做了什么,有助于写出干净的代码。本文的主要内容如下:源文件转换为可执行文件可执行程序组成及内存布局数据存储类别一个实例总结源文件转换为可执行文件源文件经过以下几步生成可执行文件:1、预处理(preprocessor):对#include、#define、转载 2013-11-30 15:17:44 · 797 阅读 · 0 评论 -
C语言中字符数组和字符串指针分析
这几天搞Unix上的C程序,里面用到了很多字符数组和字符串指针,我记得在学完C语言后相当一段时间里,对指针这个东西还是模模糊糊,后来工作也没怎么用到过C,虽然网上这类的文章也有很多,还是决定自己在这做个小总结,也算加深下自己的印象,写了下面的测试程序:#include int main(int argc, char *argv[]){ char day[15] = "转载 2013-12-13 10:49:13 · 733 阅读 · 0 评论 -
内存越界访问
内存越界访问有两种:一种是读越界,即读了不属于自己的数据,如果所读的内存地址是无效的,程度立刻就崩溃了。如果所读内存地址是有效的,在读的时候不会出问题,但由于读到的数据是随机的,它会产生不可预料的后果。另外一种是写越界,又叫缓冲区溢出,所写入的数据对别人来说是随机的,它也会产生不可预料的后果。内存越界访问造成的后果非常严重,是程序稳定性的致命威胁之一。更麻烦的是,它造成的后果是随机的,表现转载 2013-12-13 11:25:31 · 7148 阅读 · 0 评论 -
详解大端模式和小端模式
详解大端模式和小端模式嵌入式开发交流群280352802,欢迎加入!一、大端模式和小端模式的起源 关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。战争的原因:大家都知道,吃鸡蛋的时候,原始的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯转载 2013-12-13 18:56:26 · 809 阅读 · 0 评论 -
详解结构体、类等内存字节对齐
先说个题外话:早些年我学C程序设计时,写过一段解释硬盘MBR分区表的代码,对着磁盘编辑器怎么看,怎么对,可一执行,结果就错了。当时调试也不太会,又根本没听过结构体对齐这一说,所以,问题解决不了,好几天都十分纠结。后来万般无奈请教一个朋友,才获悉可能是结构体对齐的事,一查、一改,果真如此。 问题是解决了,可网上的资料多数只提到内存对齐是如何做的,却鲜有提及为什么这样做(即使提,也相当简转载 2013-12-19 10:27:26 · 841 阅读 · 0 评论 -
函数调用过程栈帧变化详解
首先应该明白,栈是从高地址向低地址延伸的。每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。寄存器ebp指向当前的栈帧的底部(高地址),寄存器esp指向当前的栈帧的顶部(地址地)。下图为典型的存取器安排,观察栈在其中的位置 入栈操作:push eax; 等价于 esp=esp-4,eax->[esp];如下图出栈操作:pop e转载 2013-12-19 11:13:18 · 1665 阅读 · 0 评论 -
PDB文件:每个开发人员都必须知道的
PDB Files: What Every Developer Must Knowhttp://www.wintellect.com/CS/blogs/jrobbins/archive/2009/05/11/pdb-files-what-every-developer-must-know.aspx PDB文件:每个开发人员都必须知道的 一 什么是PDB文件大部分的开翻译 2014-05-28 23:14:12 · 1218 阅读 · 0 评论 -
vld(Visual Leak Detector 内存泄露检测工具
初识Visual Leak Detector 灵活自由是C/C++语言的一大特色,而这也为C/C++程序员出了一个难题。当程序越来越复 杂时,内存的管理也会变得越加复杂,稍有不慎就会出现内存问题。内存泄漏是最常见的内存问题之一。内存泄漏如果不是很严重,在短时间内对程序不会有太大的 影响,这也使得内存泄漏问题有很强的隐蔽性,不容易被发现。然而不管内存泄漏多么轻微,当程序长时间运行时,其破坏力是转载 2014-05-28 23:40:04 · 912 阅读 · 0 评论 -
C++ 对象的内存布局(上) 分类: 编程语言
C++ 对象的内存布局(上) 陈皓http://blog.youkuaiyun.com/haoel 点击这里查看下篇>>>前言 07年12月,我写了一篇《C++虚函数表解析》的文章,引起了大家的兴趣。有很多朋友对我的文章留了言,有鼓励我的,有批评我的,还有很多问问题的。我在这里一并对大家的留言表示感谢。这也是我为什么再写一篇续言的原因。因为,在上一篇文章中,我用了的示例都是非转载 2013-03-30 13:33:53 · 818 阅读 · 0 评论 -
结构体对齐问题以及强制类型转换问题总结
一、什么是对齐 现在使用的计算机中内存空间都是按照字节划分的,从理论上讲似乎对任何类型的变量的访问都可以从任何地址开始,但实际上计算机系统对于基本数据类型在内存中的存放位置都有限制。举个例子,一个变量占用n个字节,则该变量的起始地址必须能够被n整除,即存放起始地址%n = 0。各种基本数据结构类型在内存中是按照这种规则排列,而不是一个紧接着一个排列的。这就是内存对齐。转载 2013-04-17 14:16:27 · 1189 阅读 · 0 评论 -
格式化字符串攻击原理及示例
一、类printf函数簇实现原理类printf函数的最大的特点就是,在函数定义的时候无法知道函数实参的数目和类型。对于这种情况,可以使用省略号指定参数表。带有省略号的函数定义中,参数表分为两部分,前半部分是确定个数、确定类型的参数,第二部分就是省略号,代表数目和类型都不确定的参数表,省略号参数表中参数的个数和参数的类型是事先的约定计算出来的,每个实参的地址(指针)是根据确定转载 2013-09-26 21:46:02 · 1018 阅读 · 0 评论 -
C/C++变量在内存中的分布
C/C++变量在内存中的分布在笔试时经常考到,虽然简单,但也容易忘记,因此在这作个总结,以加深印象。先写一个测试程序:[cpp] view plaincopy#include #include int g_i = 100; int g_j = 200; int g_k, g_h; int main()转载 2013-03-30 16:06:10 · 864 阅读 · 0 评论 -
C++内存对象大会战
如果一个人自称为程序高手,却对内存一无所知,那么我可以告诉你,他一定在吹牛。用C或C++写程序,需要更多地关注内存,这不仅仅是因为内存的分配是否合理直接影响着程序的效率和性能,更为主要的是,当我们操作内存的时候一不小心就会出现问题,而且很多时候,这些问题都是不易发觉的,比如内存泄漏,比如悬挂指针。笔者今天在这里并不是要讨论如何避免这些问题,而是想从另外一个角度来认识C++内存对象。我们知道,C转载 2013-04-28 17:42:19 · 785 阅读 · 0 评论 -
c++继承中的内存布局
今天在网上看到了一篇写得非常好的文章,是有关c++类继承内存布局的。看了之后获益良多,现在转在我自己的博客里面,作为以后复习之用。——谈VC++对象模型(美)简.格雷程化 译译者前言一个C++程序员,想要进一步提升技术水平的话,应该多了解一些语言的语意细 节。对于使用VC++的程序员来说,还应该了解一些VC++对于C++的诠释。 Inside the C++ Obj转载 2013-03-30 17:18:56 · 792 阅读 · 0 评论 -
C++程序运行时内存布局之----------简单类实例,成员变量,成员函数,静态成员变量,静态成员函数
[cpp] view plaincopy#include using namespace std; class CSimple { public: //静态成员变量 static const int sx = 0; //静态函数 static void SF1() { }转载 2013-03-30 15:28:51 · 3983 阅读 · 0 评论 -
基础备忘之c++内存分布:代码段、全局数据区、栈、堆
声明两点:(1)开发测试环境为VS2010+WindowsXP32位;(2)内存布局指的是虚拟内存地址,不是物理地址。1.测试代码[cpp] view plaincopy#include using namespace std; int g_int_a; int g_int_b转载 2013-03-06 08:40:11 · 920 阅读 · 0 评论 -
探讨C++ 变量生命周期、栈分配方式、类内存布局、Debug和Release程序的区别(一)
本文会以此问题作为讨论的实例,来具体讨论以下四个问题:(1) C++变量生命周期(2) C++变量在栈中分配方式(3) C++类的内存布局(4) Debug和Release程序的区别也许您觉得这些讨论问题没有实际意义,应该多做些提高生产力的事情,如同重复发明轮子也是没有意义的。笔者同意这个观点,但是,作转载 2013-06-21 18:38:03 · 1008 阅读 · 0 评论 -
探讨C++ 变量生命周期、栈分配方式、类内存布局、Debug和Release程序的区别(二)
本文会以此问题作为讨论的实例,来具体讨论以下四个问题:(1) C++变量生命周期(2) C++变量在栈中分配方式(3) C++类的内存布局(4) Debug和Release程序的区别 1、Debug版本输出现象解析先来说说Debug版本的输出,前5次输出,交替输出,后5次输出,交替输出,但是,前转载 2013-06-21 18:39:09 · 887 阅读 · 0 评论 -
关于内存和指针操作,数据类型转换本质的理解
Delphi 关于内存和指针操作,数据类型转换的本质的理解。很多朋友问的问题感觉都是没有理解内存和指针与数据类型之间的关系。想解释一下。 很少写东西,觉得有些东西不好表达,就想到那说到那了,希望能提供一些帮助。指针的使用,和使用指针直接读取数据是软件开发中经常使用到的技术,也是软件开发所需要掌握的基础,理解并能灵活的使用指针来操作内存,读写数据是软件开发必须要熟练掌握的基本。内转载 2013-08-13 22:46:29 · 724 阅读 · 0 评论 -
大小字节序问题
二进制文件的字节顺序问题:大端字节(big-endian)和小端字节(little-endian) 今天碰一个关于字节顺序的问题,虽然看起来很简单,但一直都没怎么完全明白这个东西,索性就找了下资料,把它弄清楚. 因为现行的计算机都是以八位一个字节为存储单位,那么一个16位的整数,也就是C语言中的short,在内存中可能有两种存储顺序big-endian和litte-en转载 2013-08-13 23:30:34 · 1215 阅读 · 0 评论 -
C++指针与地址详解
◆ 1、“存储器”的概念文件柜-->文件柜上的抽屉-->抽屉上的编号对应于:存储器----->存储单元----->存储单元的地址◆ 2、存储器的使用1)定义变量时,系统为变量分配相应的存储单元,通过变量名可以直接使用该存储单元。例如: int x=5,y; y=15; // y可以理解成该存储单元的当前名字2) 通过存储单元的地址来使用该存储单元转载 2013-09-21 01:43:51 · 1470 阅读 · 0 评论 -
应用 Valgrind 发现 Linux 程序的内存问题
应用 Valgrind 发现 Linux 程序的内存问题如何定位应用程序开发中的内存问题,一直是 inux 应用程序开发中的瓶颈所在。有一款非常优秀的 linux 下开源的内存问题检测工具:valgrind,能够极大的帮助你解决上述问题。掌握 valgrind 的使用以及工作原理,能够有效地定位进而避免应用开发中的内存问题。5 评论:杨 经 (cdl转载 2014-09-07 11:35:45 · 745 阅读 · 0 评论