像下面这个简单的例子,一个类模板,只有一个指针成员 ref,一个打印函数 print().
template <class T>
class Refer{
T* ref;
Refer(T* _ref){
this->ref = _ref;
}
void print(){
printf("%p", this->ref);
}
}
//测试
int main(){
int i;
char c;
Refer<int> i_ref(&i);
Refer<char> c_ref(&c);
i_ref.print();
c_ref.print();
}
虽然 ref 会指向各种 T 类型(上面的例子里是 char 和 int),但鉴于 ref 字段本身的 size 是确定的,而 print()函数也并不访问 T 的内部,编译器似乎生成一份代码就够用了.对吗?或者说,编译时为了类型检查,可以给 char 和 int 各自生成一份代码,但到了链接,也许应该"优化合并"成一份代码?因为这两份代码的汇编似乎是一样的. c++的类型信息不需要带到运行时.
我用 g++ -O 编译(默认),发现构造函数和 print()函数分别生成两份.(一共 call 了 4 个不同的函数) 用 g++ -O3 编译,构造和 print()函数都被优化掉了.
我自己还在努力测试中,各位如有类似的经验能否分享一下?先说声感谢.我最终想搞清的是,模板是不是一定会引起代码膨胀,感觉对指针类型的模板类,又不解引用的话,"一个类型生成一份代码",有些浪费.
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.