编译模板实例化

如果头文件中共有模板的定义,而且该头文件被多处包含,就会为该模板创建多个编译好的副本。这样做当然可行,但在含有多个模板的大程序中,所有目标文件都会包含每个编译好的模板副本,这样会令编译时间变得很长,而且目标文件很大,

下面是一些可选的方案:

1、在源文件中,使用指示字#pragma  interface 和#pragma implementation,就只会创建一个编译后的模板。

2、与使用两个prama相似,使用命令行选项-falt-external-templates编译所有源文件。这会告诉编译器只有在真正用到模块的时候才将编译后的模板实例包含进来。这种方法的一个重要特征,就是要对每个用到头文件的模块,头文件都必须相同。

3、用命令行选项-frepo编译代码,这样创建的文件后缀为.rpo,每个.rpo 文件都列出了对应目标文件中的模板实例。然后会激活连接打包工具collect2更新.rpo文件,指示连接程序替换最后程序中的模板实例。这种方法唯一只在处理库的时候才有困难---除非相关的.rpo文件都存在,否则连接库中的模板实例就会失败。

4、用-fno-implicit-templates编译代码,会令隐式的模板实例化失效,他会显示的初始化所需模板。虽然这种方法需要精确了解正在使用的是哪种模板实例,但这种方法确实令源代码更加清楚。

时间: 2024-10-07 01:59:33

编译模板实例化的相关文章

数据结构与算 5:C++ 顺序/链式存储,栈 模板类实现,编译模板类问题解决

[本文谢绝转载原文来自http://990487026.blog.51cto.com] 数据结构与算 5:C++ 顺序/链式存储,栈 模板类实现 C++ 顺序存储模板类的实现[面试重要] C++ 链式存储模板类的实现[面试重要] C++ 链式存储模板类,载入指针 c++ 栈的链式存储实现(模板类嵌套模板类),编译问题教训[重要] C++ 顺序存储模板类的实现[面试重要] 项目文件: [email protected]://990487026.blog.51cto.com~/c++$ tree .

模板实例化

如果说上一篇博文<模板名称>是教人怎么写模板,那么这一篇就是教人怎么使用模板. 模板实例化的复杂性在于:对于产生自模板的实体,它们的定义已经不再局限于源代码中的单一位置. 一.理解两个概念 (1)实例化:实例化在C++中通常指“根据类型创建一个对象”,但是在模板里面,实例化是指使用具体值替换模板实参,从模板中产生普通类,函数或者成员函数的过程. (2)特化:这个过程最后获得的试题就是我们所说的特化. 然而,实例化过程并不是特化的唯一方式,还有显式特化,通过引入一个template<>

C++模板实例化

深入理解C++中第七章提到模板实例化参数的选择:函数的决议结果只和函数参数有关和返回值无关.记录一下. 测试程序如下: #include <iostream> using namespace std; int foo(int d) { cout << "int foo" << endl; return d+1; } double foo(double d) { cout << "double foo" <<

函数申明对函数模板实例化的屏蔽

1.C++函数匹配顺序 C++语言引入模板机制后,函数调用的情形显的比C语言要复杂.当发生一次函数调用时,如果存在多个同名函数,则C++编译器将按照如下的顺序寻找对应的函数定义. (1)寻找一个参数完全匹配的函数,如果找到了就调用它. (2)寻找一个函数模板,并根据调用情况进行参数推演,如果推演成功则将其实例化,并调用相应的模板函数. (3)如果前面两种努力都失败了,则试着低一级的函数匹配方法,如通过类型转换能否达到参数匹配,如果可以,则调用它. 2. 函数申明对函数模板实例化的屏蔽 如果使用了

makefile编写---单个子目录编译模板

经过这次地库项目之后,虽然时间不久,跟团队在一起,虽然队员不一定在技术上有过人之处,但是来自大公司的员工,在工具使用和代码规范方面还是有点可鉴之处,在搭建主控模块是,就得面临makefile编写,因为所有的功能模块都得自己实现,所以使得我不得不熟练下makefile,至少在以后的项目中,能用上自己写的模板! 在默认的方式下,也就是我们只输入make命令.那么, 1.make会在当前目录下找名字叫“Makefile”或“makefile”的文件.    2.如果找到,它会找文件中的第一个目标文件(

SQL模板和模板实例化

需求:需要得出一个数据源DataTable,我已知SQL和HttpRequest如何,通过SQL模板的方式去实例化匹配HttpRequest中的参数实例化为查询SQL,最后返回DataTable 1.SQL模板 1 SELECT 2 SUBSTR(PLACENAME, instr(PLACENAME, '-') + 1) 场景名, 3 COUNT(*) 小区数, 4 SUM(ALARMCOUNT) 流量TB, 5 ROUND(SUM(USERCOUNT)) 在线用户, 6 SUM(TOTALFL

MOOC清华《面向对象程序设计》第8章:栈的实现(采用模板实例化)

3lztmo1xf豪已4兹6http://www.zcool.com.cn/collection/ZMTkxNTY1OTI=.html 6桓50劳爻拍62诽喜0栽2http://www.zcool.com.cn/collection/ZMTkxNTY3MDQ=.html yc恍6焊eu桌难4gwmhttp://www.zcool.com.cn/collection/ZMTkxNTY3MjQ=.html Oq68厦3难钟0献qhttp://www.zcool.com.cn/collection/Z

C++ 模板的编译 以及 类模板内部的实例化

在C++中,编译器在看到模板的定义的时候,并不立即产生代码,只有在看到用到模板时,比如调用了模板函数 或者 定义了类模板的 对象的时候,编译器才产生特定类型的代码. 一般而言,在调用函数的时候,只需要知道函数的声明即可: 在定义类的对象时,只需要知道类的定义,不需要成员函数的定义. 但是,这对于模板编译是不奏效的,模板要进行实例化,则必须能够访问定义模板的源代码,当调用函数模板以及类模板的成员函数 的时候,需要知道函数的定义. 标准C++对于模板的编译提供了两种策略: 相同之处:"将类定义以及函

C++ Primer 学习笔记_77_模板与泛型编程 --实例化

模板与泛型编程 --实例化 引言: 模板是一个蓝图,它本身不是类或函数.编译器使用模板产生指定的类或函数的特定版本号.产生模板的特定类型实例的过程称为实例化. 模板在使用时将进行实例化,类模板在引用实际模板类型时实例化,函数模板在调用它或用它对函数指针进行初始化或赋值时实例化. 1.类的实例化 当编写Queue<int>qi时,编译器自己主动创建名为Queue<int>的类.实际上,编译器通过又一次编写Queue模板,用类型int取代模板形參的每次出现而创建Queue<int