现在的位置: 首页 > 综合 > 正文

使用C++模板和不使用C++模板两种情况中的执行代码大小近似估计

2013年10月28日 ⁄ 综合 ⁄ 共 738字 ⁄ 字号 评论关闭
使用C++模板和不使用C++模板两种情况中的执行代码大小近似估计
 
使用模板后,对每种数据类型的实例都会生成一段新的执行代码,举例如下:
 
stack s1;
stack s2:
 
s1.push(100);
s2.push(5.3);
 
上面的s1.push(100); 和s2.push(5.3);两条语句调用的虽然都是push()函数,可以通过反编译看到它们的执行代码在内存中的位置是不同,同一个函数在内存中有了两份拷贝。
 
模板的这种性质使得使用模板的程序比不使用模板的程序执行文件会更大一些,到底会大多少呢?我们可以做一个简单的估计如下:
 
假设一个没有使用模板的软件执行代码的规模为S,里面有规模为M的执行代码可以改成模板实现,并假设改成模板后源代码规模和原来一样大小,那么不能改成用模板实现的执行代码规模为为S-M,假设每个容器平均的不同数据类型实例有I个,那么使用模板后执行代码规模将变成
S-M + I * M ;
规模将增大大约 (S+(I - 1)*M) / S 倍。
如果有20%的代码是用模板实现的话,即M = 0.2S,并假设I值为10,那么执行代码规模将增加
       (S+(10-1)*0.2S) / S = 2.8倍;
在大型软件种I值还会高一些,假设I值为20,并假设有30%的代码用模板实现的情况下,执行代码规模将增加:
(S+(20-1)*0.3S) / S = 6.7倍;
 
可见使用模板后的软件执行代码很容易膨胀,软件越大,I 值就越大,膨胀的倍数就越容易增大。另外模板代码占整个代码的比例也起了很大的决定性作用,如果大型软件中模板实现的代码占整个代码的比例上升到一定程度,执行软件规模将膨胀很多倍。执行时执行文件装载到内存中占用的内存也自然跟着增长了很多倍。
 
以上只是一个近似估计,如有不当之处,请指正。

 

抱歉!评论已关闭.