博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
膨胀的template class成员函数
阅读量:7071 次
发布时间:2019-06-28

本文共 1340 字,大约阅读时间需要 4 分钟。

前提:

//2个不同的array类std::array
arr10;std::array
arr5;

如要编写如上的template class

template 
class XArr {...public: void insert() {}};XArr
a10; //产生一个XArr
class XArr
a5; //产生XArr
a10.insert() //产生一个实现a5.insert() //又一个实现

将产生2个类, 2份insert实现(如果有调用的话)

膨胀的template class 的原因是参数
因此让目标代码膨胀减少的方法是,提取一个template父类:

//一个模版父类,需要用到的函数放在这儿template < typename T>class XBase{public:        void insert() {} //类型一致的公用一套代码};template 
class XArr : public XBase
{public: void test() { cout << __FUNCTION__ << endl;}};XArr
a10; //产生一个XArr
class XArr
a5; //产生XArr
a10.insert() //XBase
::inserta5.insert() //与上面的insert 同一实现

虽然无法减少XArr 类的实例化 ,至少减少了insert函数的实例化

简单验证一下:

union{        void (XArr
::*pfunc1)(); void (XArr
::*pfunc2)(); int addr; } up; up.pfunc1= &XArr
::test; //XArr 自己的函数将生成2份 cout << up.addr << endl; up.pfunc2 = &XArr
::test; cout << up.addr << endl; up.pfunc1= &XArr
::insert; //TBase
的insert 只有一份 cout << up.addr << endl; up.pfunc2 = &XArr
::insert; cout << up.addr << endl;

转载地址:http://yghll.baihongyu.com/

你可能感兴趣的文章
iOS开发滚动视图UIScrollView
查看>>
SSH服务及其扩展(sshpass和expect)
查看>>
mysql中的锁
查看>>
会话Cookie与session的关系
查看>>
Blend ---- 自定义ImageButton(图片按钮)
查看>>
04-模板层
查看>>
Beta冲刺-第二天
查看>>
call 和 apply方法解析
查看>>
Update emacs to 23.2 on Ubuntu
查看>>
C#中结构(struct)与类(class)的区别
查看>>
mount loop最大数的调整
查看>>
Android的消息机制(1)
查看>>
树的创建与遍历
查看>>
进度条控件基本使用
查看>>
DataGrid PCV排序学习
查看>>
centos7安装jdk1.8
查看>>
Vue中v-for的数据分组
查看>>
实现选项卡的原理
查看>>
ajax 无刷新下拉加载更多。
查看>>
杭电 1287 破译密码
查看>>