- 论坛徽章:
- 2
|
本来见这帖子沉了 …… 就算了 …… 结果又被顶起来了 ……
原帖由 reiase 于 2009-4-9 13:04 发表
在A库中被实例话foo<int>,在B库中也实例化foo<int>.因此A,B中各有一份实例化的foo<int>,我搞不懂同时连接A,B两个库时咋办,连接器不会报错吗?
简单的说, 没有二进制的模板库, 模板库都是源代码级的。
目前支持export的编译器依然需要源代码。
通常不会将模板、 类、 异常这些东西从库中导出。
导出的只是函数+基本类型, 也就是C接口。
因为C++没有二进制标准。 其实这是我对C++最不满的地方 …… 许多时候都麻烦死 ……
从库中导出C++的东西, 通常只是为了方便, 不是为了发布。
比如, 把boost中的某些东西, 编译成库, 省去每次都再编译的时间。
如果打算发布C++的binary库, 就必须给不同编译器上的不同版本分别编译出一个二进制库然后发布。
这就将开发库的编译器(包括一些编译选项)和使用库的编译器绑定死了。
原帖由 reiase 于 2009-4-9 13:04 发表
连接器不会报错吗?或者说编译器为由模板实例化的函数自动添加static内部连接属性,这样不会造成二进制文件体积爆炸式膨胀吗?这个问题还真搞不懂,请你指点了
链接器当然不会报错, 你用过模板的吧?
具体的作法C++标准没有规定。
你说的这个是一种方式, 对每个翻译单元, 都暴力编译一次。
但是最后链接的时候, 将重复的副本删除。
这几天我做了一些测试, 不过数据太多, 需要整理整理 ……
大致结论就是, 编译器确实会删除这些副本, 只留下一个模板实现代码。
测试环境有这些 :
msvc8、 gcc (GCC) 3.4.2 (mingw-special),gcc (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu3)
抑制代码膨胀, 编译器方面是做了工作的。
剩下的工作就是模板的编写者了。
这个是指导方针 : “C++箴言:从模板中分离出参数无关的代码 ” http://dev.yesky.com/392/2249392.shtml
还有一个结论, 编译确实很慢 ……
500行不到的东西, 需要要编译7分钟 ……
俺前边提到过超线性并行受益吧,我觉得既然有些优化是不可能在编译时进行的,这里也存在一个超线性的问题,没准会超过C++.参考前边说过的那个脚本语言快过C++的例子
原帖由 reiase 于 2009-4-9 13:04 发表
俺前边提到过超线性并行受益吧,我觉得既然有些优化是不可能在编译时进行的,这里也存在一个超线性的问题,没准会超过C++.参考前边说过的那个脚本语言快过C++的例子
在这点上, 我觉得被你忽悠了 ……
另外一楼中再请教你 |
|