用汇编的眼光看C++(之缺省模板、特化模板) (三)

2014-11-24 12:43:50 · 作者: · 浏览: 2
esi

0040145F pop ebx

00401460 add esp,44h

00401463 cmp ebp,esp

00401465 call __chkesp (004023b0)

0040146A mov esp,ebp

0040146C pop ebp

0040146D ret

242: data() {printf("point!\n");}

00401430 push ebp

00401431 mov ebp,esp

00401433 sub esp,44h

00401436 push ebx

00401437 push esi

00401438 push edi

00401439 push ecx

0040143A lea edi,[ebp-44h]

0040143D mov ecx,11h

00401442 mov eax,0CCCCCCCCh

00401447 rep stos dword ptr [edi]

00401449 pop ecx

0040144A mov dword ptr [ebp-4],ecx

0040144D push offset string "point!\n" (00426074)

00401452 call printf (00401540)

00401457 add esp,4

0040145A mov eax,dword ptr [ebp-4]

0040145D pop edi

0040145E pop esi

0040145F pop ebx

00401460 add esp,44h

00401463 cmp ebp,esp

00401465 call __chkesp (004023b0)

0040146A mov esp,ebp

0040146C pop ebp

0040146D ret

看到上面的函数,大家应该明白了两者调用的构造函数并不一样。所以说,特化模板通常就是为了那些特殊的数据类型准备的。这样我们使用者在使用模板的时候就没有什么顾虑了,可以忽略各个数据类型处理上的差别了。当然,特化模板因为考虑了特殊模型数据,使得我们的代码更加完毕,更加健壮了,建议在设计模板的时候适当多使用。

思考题:

(1)模板类第一个type可以缺省吗?为什么会这么考虑?

(2)下面的代码在vc 6.0和vc 2005上都能编译过?为什么呢?对于我们设计代码有什么思考呢? (建议从兼容性上面考虑)

template

class data

{

public:

data() {printf("normal!\n");}

~data() {printf("~normal!\n");}

};

template

class data

{

public:

data() {printf("point!\n");}

~data() {printf("point!\n");}

};

template

class data

{

public:

data() {printf("normal!\n");}

~data() {printf("~normal!\n");}

};

template

class data

{

public:

data() {printf("point!\n");}

~data() {printf("point!\n");}

};