凌云窟
南山巅上火麟烈,北海潜深雪饮寒。可怜两锋未缘见,雪刀封隐孤剑鸣。
<
2007年6月
>
日
一
二
三
四
五
六
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
留言簿(0)
给我留言
查看公开留言
查看私人留言
随笔分类
嵌入式 (0)
(rss)
MINIX 学习笔记 (4)
(rss)
杂谈春秋 (5)
(rss)
ASM, C , C++ ... (7)
(rss)
Win32 sdk, mfc ... (4)
(rss)
COM, OLE, ATL ... (2)
(rss)
随笔档案
2007年7月 (1)
2007年6月 (1)
2006年12月 (4)
2006年9月 (1)
2006年8月 (4)
2006年5月 (3)
2006年2月 (8)
文章档案
相册
我的相册 (2)
简历下载
谢谢关注
搜索
最新评论
1. re: 很遗憾,minix的阅读计划被我取消了
你可以去死了。
--smartly
2. re: 透明文本、位图的实现方案
双缓冲的确不是画在父窗口,之所以透明,是因为内存dc背景为父窗口背景.
--yaowei
3. re: 构造函数调用虚函数追踪
好东西,谢谢分享
--粉末涂料
4. re: 终于启动minix源代码阅读计划了!
我基本上把MINIX3主要的东西看完了。我的BLOG上有两篇文章是关于MINIX3的。有空可以交流。
http://jnxnj.spaces.live.com
--k
5. re: 很遗憾,minix的阅读计划被我取消了
如果是迫于工作压力可以理解,一个人的精力毕竟有限。学MINIX关键是学其中的思想。MINIX3当然没有LINUX成熟,minix3 连分页都没有,关于线程的概念也没有,等等。但是,将MINIX3作为微内核的代表来看,你会发现学了是一个不小的收获。
--k
6. 欢迎交流minix3
我在chinaunix上的BLOG
devahb.cublog.cn
--JEFF
7. re: 构造函数调用虚函数追踪
vc资料站:
http://www.vcmsdn.com/
对学习很有帮助的,可以上去
看看,或加群46138350,里面有高手可以请教的。
--maggie
8. re: x86是满递减堆栈还是空递减堆栈?
vc资料站:
http://www.vcmsdn.com/
对学习很有帮助的,可以上去
看看,或加群46138350,里面有高手可以请教的。
--maggie
9. re: x86是满递减堆栈还是空递减堆栈?
x8086汇编基础课程中的push/pop,有详细介绍。。。。
注:debug/release下的对应汇编有的存在差异(eg:switch/call),用release中的listfile输出.asm文件~
--windowssky
10. re: 构造函数调用虚函数追踪
赞同你的意见,当时这么想是因为看过一本书,那里说在构造函数就要设置好虚函数表,所以自然就想在构造函数中既然虚函数表已经设定好了,那有可能调用虚函数是通过虚函数表来调用哦。
当然,事实证明这种说法是错的!原因正如你所说。
--莫问春秋
阅读排行榜
1. 终于启动minix源代码阅读计划了!(5542)
2. 构造函数调用虚函数追踪 (4860)
3. Minix3 Context Switch实现分析(4562)
4. C++多态居然可以这样用?(3925)
5. x86是满递减堆栈还是空递减堆栈?(3712)
6. 关于operator=的一点疑问?(3330)
7. 短短2个多月,身边变化太大了(3062)
8. C++ 备忘录 (一)(2676)
9. thunk初探(2332)
10. COM问答录 (2314)
评论排行榜
1. C++多态居然可以这样用?(6)
2. 关于operator=的一点疑问?(6)
3. 构造函数调用虚函数追踪 (5)
4. 终于把家搬到vckbase了 -_-(4)
5. 终于启动minix源代码阅读计划了!(4)
6. COM问答录 (2)
7. 很遗憾,minix的阅读计划被我取消了(2)
8. Minix3 Context Switch实现分析(2)
9. x86是满递减堆栈还是空递减堆栈?(2)
10. 透明文本、位图的实现方案(2)
VC知识库BLOG
首页
新随笔
联系
聚合
登录
随笔-22 文章-0 评论-38 Trackbacks-0
构造函数调用虚函数追踪
好久不写blog都生疏了,刚好公司要组织一次C++的基本功考试,就一个派生类调用虚函数的问题研究了一下编译器的实现:
class
A
{
public
:
A()
{}
~
A()
{}
virtual
void
Display()
{cout
<<
"
A
"
<<
endl;}
}
;
class
B:
public
A
{
public
:
B()
{Display();}
~
B()
{}
virtual
void
Display()
{cout
<<
"
B
"
<<
endl;}
}
;
int
main()
{
B
*
pBb
=
new
B;
delete pBb;
}
在B(){Display();}设定一个断点,跟踪到汇编代码得到如下代码:
00401391 mov eax,dword ptr [ebp-10h]
00401394 mov dword ptr [eax],offset B::`vftable' (00432020)
0040139A mov ecx,dword ptr [ebp-10h]
0040139D call
@ILT+155(B::Display) (004010a0)
前三排的代码是设置虚函数表,然后直接调用了B::Display函数,并没有通过虚函数表间接调用这个函数。这说明在构造函数中虽然虚函数表已经设置好了,但是调用虚函数是不会使用虚函数表的,是直接调用.
下面的代码是非构造函数内经过虚函数表间接调用Display的汇编码:
0040127E mov edx,dword ptr [ebp-10h]
00401281 mov eax,dword ptr [edx]
00401283 mov esi,esp
00401285 mov ecx,dword ptr [ebp-10h]
00401288 call
dword ptr [eax]
posted on 2007-06-27 22:33 莫问春秋 阅读(4860)
评论(5)
编辑
收藏
Comments
#
没人灌,那我灌吧
周星星
Posted @ 2007-06-29 17:58
虚函数表的作用是什么?
因为对象的动态类型是什么,必须到运行时才知道,也就是只有到运行到那一步时,才知道应该实际调用哪个virtual函数。
但在构造函数中,需要到运行时才能知道吗?它本身的类型就是其动态类型,所以根本不需要去查虚函数表。
#
re: 构造函数调用虚函数追踪
上海地图
Posted @ 2007-07-02 12:17
关注!
#
re: 构造函数调用虚函数追踪
莫问春秋
Posted @ 2007-07-02 22:13
赞同你的意见,当时这么想是因为看过一本书,那里说在构造函数就要设置好虚函数表,所以自然就想在构造函数中既然虚函数表已经设定好了,那有可能调用虚函数是通过虚函数表来调用哦。
当然,事实证明这种说法是错的!原因正如你所说。
#
re: 构造函数调用虚函数追踪
maggie
Posted @ 2007-09-03 15:49
vc资料站:
http://www.vcmsdn.com/
对学习很有帮助的,可以上去
看看,或加群46138350,里面有高手可以请教的。
#
re: 构造函数调用虚函数追踪
粉末涂料
Posted @ 2008-05-27 11:58
好东西,谢谢分享
标题
姓名
主页
验证码
*
内容
Remember Me?
登录
使用高级评论
Top
[使用Ctrl+Enter键可以直接提交]