2010年8月20日
摘要: 自己动手理解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 烛秋 阅读(2057) 评论(0) 推荐(0) 编辑
摘要: 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 烛秋 阅读(1966) 评论(3) 推荐(1) 编辑
摘要: 虚函数表里边保存的不一定是虚函数的地址 我一直以为虚函数表里边保存的就是虚函数的地址,前几天做测试的时候才发现这想法不一定是对的。测试代码://虚函数表里边保存的不一定是虚函数的地址.cpp//2010.8.19/*分析:通过最后的输出结果可以发现,通过Derived类的虚函数表调用所有的虚函数,发现第一张虚函数表的输出①和第二张虚函数表的输出④它们是同一个函数的输出,在虚函数表项上的值却是不同的。如果虚函数表上的项的值都是虚函数的地址,那么Derived的两张表里边用于调用show()函数的表项的值应该是相同的,但事实上它们不同。这说明,虚函数表里边保存的未必就是虚函数的地址。这种情况在之. 阅读全文
posted @ 2010-08-20 16:25 烛秋 阅读(3944) 评论(0) 推荐(1) 编辑
摘要: C++对象内存布局测试总结 http://hi.baidu.com/%D6%F2%C7%EF/blog/item/826d38ff13c32e3a5d6008e8.html 上文是半年前对虚函数、虚拟继承的理解。可能有一些错漏。而且只是理解了比较简单的部分,表达也不够清晰,这次决定花的时间再做一次总结。 对于普通的C++对象内存布局,简单得不得了,就不做总结了。这里只总结涉及到虚拟继承的情况。 因为不同编译器对虚拟继承的实现采用不同的方式,所以要完整的分析是不可能的。这里只考虑VS2005/2008,还有简单涉及GCC编译器。1、 单个虚拟继承只是为了分析而已,实际中并没有太大的作用。... 阅读全文
posted @ 2010-08-20 02:07 烛秋 阅读(5233) 评论(5) 推荐(0) 编辑
摘要: 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 烛秋 阅读(3940) 评论(0) 推荐(0) 编辑
摘要: C++对象内存布局--⑩GCC编译器--虚拟继承--菱形继承 阅读全文
posted @ 2010-08-20 01:24 烛秋 阅读(730) 评论(0) 推荐(0) 编辑
摘要: C++对象内存布局--⑨VS编译器--虚拟继承--菱形继承 阅读全文
posted @ 2010-08-20 01:20 烛秋 阅读(894) 评论(0) 推荐(0) 编辑
摘要: C++对象内存布局--⑧GCC编译器--虚拟继承多个基类 阅读全文
posted @ 2010-08-20 01:17 烛秋 阅读(626) 评论(2) 推荐(0) 编辑
摘要: C++对象内存布局--⑦VS编译器--虚拟继承多个基类 阅读全文
posted @ 2010-08-20 01:11 烛秋 阅读(668) 评论(2) 推荐(0) 编辑
摘要: C++对象内存布局--⑥GCC编译器-虚拟继承的虚基类表可能有两个 阅读全文
posted @ 2010-08-20 01:07 烛秋 阅读(928) 评论(2) 推荐(0) 编辑
摘要: C++对象内存布局--⑤GCC编译器--单个虚拟继承  测试GNU的GCC编译器在处理虚拟继承上跟VS不同的地方。派生类的虚函数表跟虚基类表合并。 阅读全文
posted @ 2010-08-20 01:03 烛秋 阅读(785) 评论(4) 推荐(0) 编辑
摘要: C++对象内存布局--④VS编译器--单个虚拟继承  在VS2005编译器下,证明单个虚拟继承的内存布局:无论有无虚函数,必然含有虚基类表指针。虚基类表中的内容为本类实例的偏移和基类实例的相对偏移值。  如果有虚函数,那么基类的虚函数表跟派生类的虚函数表是分开的。  在内存布局上,地址从低到高,顺序如下:派生类的虚函数表指针,虚基类表指针,派生类的成员变量,基类的虚函数表指针,基类的成员变量。也就... 阅读全文
posted @ 2010-08-20 00:58 烛秋 阅读(702) 评论(2) 推荐(0) 编辑
摘要: C++对象内存布局--③测试多继承中派生类的虚函数在哪一张虚函数表中测试2:证明派生类的虚函数的地址跟第一基类的虚函数地址保存在同一张虚函数表中。   派生类有多少个拥有虚函数的基类,派生类对象就有多少个指向虚函数表的指针。 阅读全文
posted @ 2010-08-20 00:50 烛秋 阅读(1331) 评论(4) 推荐(0) 编辑
摘要: C++对象内存布局--②测试派生类跟基类的虚函数表测试2:父类虚函数表跟子类虚函数表是不同的。[代码] 阅读全文
posted @ 2010-08-20 00:39 烛秋 阅读(1020) 评论(2) 推荐(0) 编辑
摘要: C++对象内存布局--①测试虚函数表属于类测试1:同一个类的多个对象共享同一张虚函数表。 阅读全文
posted @ 2010-08-20 00:22 烛秋 阅读(1959) 评论(0) 推荐(0) 编辑