看雪论坛
发新帖

[求助]cpp中模板一类语法编译器是如何实现的?

cqrstan 2017-6-19 18:29 564

cpp中模板有类模板和函数模板,以函数模板举例。

//定义

template <typename _cqr>

int test()

{

    _cqr a;

    _cqr b;

}

//调用

test<int> ();


那么问题来了,在编译器实现模板这一功能时,是先把函数copy并替换为int,copy并替换为char,copy并替换为bool...(此处省略)然后再编译链接么?

还是直接编译,然后利用汇编进行自修改(我记得壳就利用自修改来加密文件,例如rlpack等壳)呢?

求大神解答

本主题帖已收到 0 次赞赏,累计¥0.00
最新回复 (5)
hzqst 2017-6-20 09:44
2
你把它当成高级版#define就行了
cqrstan 2017-6-27 21:23
3
hzqst 你把它当成高级版#define就行了
他是在哪个头文件里进行宏定义的呢?
(十分感谢,原理明白了)
rrrfff 2017-6-27 21:55
4
肯定不是自修改,  模版特化后和非模版等价,  会生成不同的函数
hzqst 2017-6-27 22:54
5
cqrstan 他是在哪个头文件里进行宏定义的呢? (十分感谢,原理明白了)
编译器内部自己进行处理,不会给这些东西生成中间文件
leeqwind 2017-7-2 23:06
6

编译生成bin文件对比一下汇编就知道了:

template <typename _cqr>
_cqr test(_cqr b)
{
    _cqr a = b;
    return a;
}
int __cdecl main(int argc, char *argv[])
{
    test<int>(1);
    test<char>('A');
}
========
    test<int>(1);
008D1788  push        1  
008D178A  call        test<int> (08D1600h)  
    test<char>('A');
008D178F  push        41h  
008D1791  call        test<char> (08D15D0h)  

template <typename _cqr>
_cqr test(_cqr b)
{
008D15D0  push        ebp  
008D15D1  mov         ebp,esp  
008D15D3  sub         esp,0CCh  
008D15D9  push        ebx  
008D15DA  push        esi  
008D15DB  push        edi  
008D15DC  lea         edi,[ebp-0CCh]  
008D15E2  mov         ecx,33h  
008D15E7  mov         eax,0CCCCCCCCh  
008D15EC  rep stos    dword ptr es:[edi]  
    _cqr a = b;
008D15EE  mov         al,byte ptr [b]  
008D15F1  mov         byte ptr [a],al  
    return a;
008D15F4  mov         al,byte ptr [a]  
}
008D15F7  pop         edi  
}
008D15F8  pop         esi  
008D15F9  pop         ebx  
008D15FA  mov         esp,ebp  
008D15FC  pop         ebp  
008D15FD  ret         4  

template <typename _cqr>
_cqr test(_cqr b)
{
008D1600  push        ebp  
008D1601  mov         ebp,esp  
008D1603  sub         esp,0CCh  
008D1609  push        ebx  
008D160A  push        esi  
008D160B  push        edi  
008D160C  lea         edi,[ebp-0CCh]  
008D1612  mov         ecx,33h  
008D1617  mov         eax,0CCCCCCCCh  
008D161C  rep stos    dword ptr es:[edi]  
    _cqr a = b;
008D161E  mov         eax,dword ptr [b]  
008D1621  mov         dword ptr [a],eax  
    return a;
008D1624  mov         eax,dword ptr [a]  
}
008D1627  pop         edi  
}
008D1628  pop         esi  
008D1629  pop         ebx  
008D162A  mov         esp,ebp  
008D162C  pop         ebp  
008D162D  ret         4

调用的是不同的函数块。

   

   

   

返回



©2000-2017 看雪学院 | Based on Xiuno BBS | 微信公众号:ikanxue
Time: 0.012, SQL: 9 / 京ICP备10040895号-17