08 2010 档案
《C++应用程序性能优化::第五章动态内存管理》学习和理解
摘要:《C++应用程序性能优化::第五章动态内存管理》学习和理解说明:《C++应用程序性能优化》 作者:冯宏华等 2007年版。2010.8.29cs_wuyg@126.com 这一章不错,之前对new和delete的理解并不是很深。虽然学C++primer的时候懂一点智能指针,但是没学过boost的智... 阅读全文
posted @ 2010-08-30 00:34 烛秋 阅读(1869) 评论(0) 推荐(0) 编辑
《C++应用程序性能优化::第四章操作系统的内存管理》学习和理解
摘要:《C++应用程序性能优化::第四章操作系统的内存管理》学习和理解说明:《C++应用程序性能优化》 作者:冯宏华等 2007年版。2010-8-24开始cs_wuyg@126.com 听说不关注内存的C++高手,是伪高手。对C++的内存学习非常重要,继续学习理解。 长期以来,在计算机系统中,内存都是一种紧缺和宝贵的资源,应用程序必须在载入内存后才能执行。以前,在内存空间不够大时,同时运行的应用程序的数量就会受到很大的限制。甚至当某个应用程序在某个运行时所需内存超过物理内存时,该应用程序就会无法运行。现代操作系统的内存管理都能解决这个问题,解决方法就是虚拟内存的引入。 本质上虚拟内存就是要让一.. 阅读全文
posted @ 2010-08-27 09:44 烛秋 阅读(3509) 评论(4) 推荐(0) 编辑
《C++应用程序性能优化::第二章C++语言特性的性能分析》学习和理解
摘要:《C++应用程序性能优化::第二章C++语言特性的性能分析》学习和理解说明:《C++应用程序性能优化》 作者:冯宏华等 2007年版。最近出了新版,看了目录,在前面增加了一章的内容,其它的没变。知识点:分析可能引起性能下降的几个方面:构造函数/析构函数,继承与虚拟,临时对象,内联函数1、性能瓶颈 很多时候,一个程序的速度在框架设计完成时大致已经确定了,而并非是因为采用了C++语言才使其速度没有达到预期的目标。当遇到性能问题时,首先应该检查和反思程序的总体框架。然后用性能检测工具对其实际运行做准确地测量,再针对瓶颈进行分析和优化,这才是正确的思路。确实有一些操作或者C++的一些语言特性比其它因. 阅读全文
posted @ 2010-08-22 17:08 烛秋 阅读(2057) 评论(0) 推荐(0) 编辑
《C++应用程序性能优化::第一章C++对象模型》学习和理解
摘要:《C++应用程序性能优化::第一章C++对象模型》学习和理解一、C++程序占用的内存区一般分为如下5种:1、 全局/静态数据区;2、 常量数据区;3、 代码区;4、 栈;5、 堆。二、对齐 字符串常量存储在常量数据区,而且是4个字节对齐的。通过new\malloc获取的内存是堆中的内存,按照16字节对齐。三、静态成员 如果要在同一个类的多个对象之间共享数据,可以使用全局变量,但这样会破坏类的封装性... 阅读全文
posted @ 2010-08-22 16:49 烛秋 阅读(1768) 评论(0) 推荐(1) 编辑
C++之this指针与另一种“多态”
摘要:C++之this指针与另一种“多态”2010-7-9烛秋一、引入 定义一个类的对象,首先系统已经给这个对象分配了空间,然后会调用构造函数(说明:假设存在构造函数--2010.9.5修正)。一个类有多个对象,当程序中调用对象的某个函数时,有可能要访问到这个对象的成员变量。而对于同一个类的每一个对象,都是共享同一份类函数。对象有单独的变量,但是没有单独的函数,所以当调用函数时,系统必须让函数知道这是哪个对象的操作,从而确定成员变量是哪个对象的。这种用于对成员变量归属对像进行区分的东西,就叫做this指针。事实上它就是对象的地址,这一点从反汇编出来的代码可以看到。二、分析1、测试代码://////. 阅读全文
posted @ 2010-08-21 09:53 烛秋 阅读(2251) 评论(3) 推荐(0) 编辑
编译器对临时变量的优化--简单理解
摘要:编译器对临时变量的优化--简单理解2010-7-6烛秋2010-8-20整理一、问题来源 之前对NRV优化做了一点总结,还有所欠缺,只分析了 A b = f();的情况,没有去分析A b; b = f();的情况。又想起之前看过的书,对产生临时对象的讲解都是假设了编译器没有进行优化,然后说要提高C++程序性能,必须尽量的少使用返回对象,因为那样才不会产生临时对象。多使用引用/指针可以减少临时对象的产生,提高程序性能,这个观点没有错。但事实上很多编译器多做了优化,使得临时对象的产生减少了很多,打算以最简单的例子对编译器的优化做简单的理解。代码:/**//////////////////////. 阅读全文
posted @ 2010-08-21 00:07 烛秋 阅读(2483) 评论(0) 推荐(0) 编辑
自己动手理解NRV优化
摘要:自己动手理解NRV优化2010.6.29烛秋2010.8.20整理说明:本文整理自:http://blog.csdn.net/wuxupeng999/archive/2010/06/29/5701513.aspx一、NRV的简单理解 NRV是Named Return Value的简称。NRV优化简单的说:有一条语句,A a = f();其中f()是一个函数,函数里边申请了一个A的对象b,然后把对象b返回。在对象返回的时候,一般情况下要调用拷贝函数,把函数f()里边的局部对象b拷贝到函数外部的对象a。但是如果用了NRV优化,那就不必要调用拷贝构造函数,编译器可以这样做,把a的地址传递进函数f(. 阅读全文
posted @ 2010-08-20 22:56 烛秋 阅读(2060) 评论(0) 推荐(0) 编辑
回答总结:C实现“动态绑定”
摘要:C实现“动态绑定”2010-7-26烛秋在论坛上看到这样一个问题:“用C能实现C++的动态绑定吗?”网址:http://topic.csdn.net/u/20100624/21/3d7eda37-cbf7-4e36-a549-f2d6f1a3eeed.html?47092。。现在看当时我的回复(ID:wuxupeng999),觉得理解上还是有些不足,... 阅读全文
posted @ 2010-08-20 22:05 烛秋 阅读(1973) 评论(3) 推荐(1) 编辑
虚函数表里边保存的不一定是虚函数的地址
摘要:虚函数表里边保存的不一定是虚函数的地址 我一直以为虚函数表里边保存的就是虚函数的地址,前几天做测试的时候才发现这想法不一定是对的。测试代码://虚函数表里边保存的不一定是虚函数的地址.cpp//2010.8.19/*分析:通过最后的输出结果可以发现,通过Derived类的虚函数表调用所有的虚函数,发现第一张虚函数表的输出①和第二张虚函数表的输出④它们是同一个函数的输出,在虚函数表项上的值却是不同的。如果虚函数表上的项的值都是虚函数的地址,那么Derived的两张表里边用于调用show()函数的表项的值应该是相同的,但事实上它们不同。这说明,虚函数表里边保存的未必就是虚函数的地址。这种情况在之. 阅读全文
posted @ 2010-08-20 16:25 烛秋 阅读(3949) 评论(0) 推荐(1) 编辑
C++对象内存布局测试总结
摘要:C++对象内存布局测试总结 http://hi.baidu.com/%D6%F2%C7%EF/blog/item/826d38ff13c32e3a5d6008e8.html 上文是半年前对虚函数、虚拟继承的理解。可能有一些错漏。而且只是理解了比较简单的部分,表达也不够清晰,这次决定花的时间再做一次总结。 对于普通的C++对象内存布局,简单得不得了,就不做总结了。这里只总结涉及到虚拟继承的情况。 因为不同编译器对虚拟继承的实现采用不同的方式,所以要完整的分析是不可能的。这里只考虑VS2005/2008,还有简单涉及GCC编译器。1、 单个虚拟继承只是为了分析而已,实际中并没有太大的作用。... 阅读全文
posted @ 2010-08-20 02:07 烛秋 阅读(5234) 评论(5) 推荐(0) 编辑
C++对象内存布局--虚基类表的使用
摘要:C++对象内存布局--虚基类表的使用一、测试VS编译器,虚基类表在函数调用时是怎么使用的1、测试代码:2、使用OllyDbg反汇编调试的相关结果:图 1 VC++6.0编译器,OD调试结果图 2 VS2005/2008编译器,OD调试结果3、结果表明,在调用虚基类函数的时候,有使用到虚基类表指针。二、测试GCC编译器,虚基类表在函数调用时是怎么使用的1、测试代码跟上边的一样。2、使用OllyDbg... 阅读全文
posted @ 2010-08-20 01:40 烛秋 阅读(3941) 评论(0) 推荐(0) 编辑
C++对象内存布局--⑩GCC编译器--虚拟继承--菱形继承
摘要:C++对象内存布局--⑩GCC编译器--虚拟继承--菱形继承 阅读全文
posted @ 2010-08-20 01:24 烛秋 阅读(730) 评论(0) 推荐(0) 编辑
C++对象内存布局--⑨VS编译器--虚拟继承--菱形继承
摘要:C++对象内存布局--⑨VS编译器--虚拟继承--菱形继承 阅读全文
posted @ 2010-08-20 01:20 烛秋 阅读(895) 评论(0) 推荐(0) 编辑
C++对象内存布局--⑧GCC编译器--虚拟继承多个基类
摘要:C++对象内存布局--⑧GCC编译器--虚拟继承多个基类 阅读全文
posted @ 2010-08-20 01:17 烛秋 阅读(626) 评论(2) 推荐(0) 编辑
C++对象内存布局--⑦VS编译器--虚拟继承多个基类
摘要:C++对象内存布局--⑦VS编译器--虚拟继承多个基类 阅读全文
posted @ 2010-08-20 01:11 烛秋 阅读(668) 评论(2) 推荐(0) 编辑
C++对象内存布局--⑥GCC编译器-虚拟继承的虚基类表可能有两个
摘要:C++对象内存布局--⑥GCC编译器-虚拟继承的虚基类表可能有两个 阅读全文
posted @ 2010-08-20 01:07 烛秋 阅读(929) 评论(2) 推荐(0) 编辑
C++对象内存布局--⑤GCC编译器--单个虚拟继承
摘要:C++对象内存布局--⑤GCC编译器--单个虚拟继承  测试GNU的GCC编译器在处理虚拟继承上跟VS不同的地方。派生类的虚函数表跟虚基类表合并。 阅读全文
posted @ 2010-08-20 01:03 烛秋 阅读(785) 评论(4) 推荐(0) 编辑
C++对象内存布局--④VS编译器--单个虚拟继承
摘要:C++对象内存布局--④VS编译器--单个虚拟继承  在VS2005编译器下,证明单个虚拟继承的内存布局:无论有无虚函数,必然含有虚基类表指针。虚基类表中的内容为本类实例的偏移和基类实例的相对偏移值。  如果有虚函数,那么基类的虚函数表跟派生类的虚函数表是分开的。  在内存布局上,地址从低到高,顺序如下:派生类的虚函数表指针,虚基类表指针,派生类的成员变量,基类的虚函数表指针,基类的成员变量。也就... 阅读全文
posted @ 2010-08-20 00:58 烛秋 阅读(702) 评论(2) 推荐(0) 编辑
C++对象内存布局--③测试多继承中派生类的虚函数在哪一张虚函数表中
摘要:C++对象内存布局--③测试多继承中派生类的虚函数在哪一张虚函数表中测试2:证明派生类的虚函数的地址跟第一基类的虚函数地址保存在同一张虚函数表中。   派生类有多少个拥有虚函数的基类,派生类对象就有多少个指向虚函数表的指针。 阅读全文
posted @ 2010-08-20 00:50 烛秋 阅读(1332) 评论(4) 推荐(0) 编辑
C++对象内存布局--②测试派生类跟基类的虚函数表
摘要:C++对象内存布局--②测试派生类跟基类的虚函数表测试2:父类虚函数表跟子类虚函数表是不同的。[代码] 阅读全文
posted @ 2010-08-20 00:39 烛秋 阅读(1020) 评论(2) 推荐(0) 编辑
C++对象内存布局--①测试虚函数表属于类
摘要:C++对象内存布局--①测试虚函数表属于类测试1:同一个类的多个对象共享同一张虚函数表。 阅读全文
posted @ 2010-08-20 00:22 烛秋 阅读(1959) 评论(0) 推荐(0) 编辑