导航:首页 > 源码编译 > 编译的函数模版

编译的函数模版

发布时间:2025-01-13 13:05:01

㈠ c++primer3中,有一句话:“在多个文件之间编译相同的函数模板定义增加了不必要的编译时间”……

简单点说,对于一个vector<int>的函数,比如size(),如果在不同的cpp中出现,在这些文件编译的时候都要把vector<int>::size()编译一遍。然后在链接的时候把重复的函数去掉。很显然增加了编译时间。

补充里你的理解是错的,模板的声明是不编译的,更没有空间,它根本不是实际的类型或函数,编译器根本不管它。只有实例化的时候,才生成真正的类型、函数,而实例化的地方不在一起,必然造成同一个类型、函数被编译了多次。反观类的编译,只在它的cpp中编译一次,其他地方都使用它的头文件得到声明。

㈡ 在c语言中如何实现函数模板

如果要写个函数支持多种数据类型,首先想到的就是C++的模板了,但是有时候只能用C语言,比如在linux内核开发中,为了减少代码量,或者是某面试官的要求…
考虑了一阵子后,就想到了qsort上.qsort的函数原型:
void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );
锋码快排时,只要自己实现相应数据类型的比较函数cmpare就可以了.如果比较int型时,一个典型的compare函数如下:

那么,就是说可以利用void *. void *意指未指定类型,也可以理解为任意类型。其他类型的指针可以直接赋值给void *变量,但是void *变量需要强制类型转换为其它指针类型。这个相信大家都知道。那么下面以一个简单的题目为例,来探讨如何在C语言中实现模板函数。
方法1: 利用void *.
在看下面的源程序之前,需要了解几点。首先,在32位平台上,任何类型的指针所占的字节都是4个字节,因为32位机器虚拟内存一般为4G,即2的32次方,只要32位即4个字节就可以足够寻址,sizeof(void *)=4; 其次,虽然各种不同类型的指针所占的空间都为4个字节,但是不同类型的指针所指的空间的字节数却不同(这一点尤为重要,下面的程序我在开始没有调通就因为这点意识不强)。所以,如果你将一个指针强制转换为另一个类型的指针,指针本身所占的字节是不变的,但是,如果对这个指针进行运算,比如 *p,p++,p-=1等一般都是不同的。 再次,函数指针应该了解下,这里不多说。 最后,因为Sandy跟我说,C++开始的时候模板的实现其册型实就是利用宏替换,在编译的时候确定类型。所以,为了方便,类型也用了预编译指令#define。

<span>#include"stdio.h"</span>

<span>#include"stdlib.h"</span>

<span>//typedefintT;//或者下面的也可以.</span>

<span>#defineTint</span>

//这个FindMin是Sandy写的.felix021也写了个,差不多的就不贴出来的.

voidFindMin(constvoid*arr,intarr_size,intarrmembersize,int*index,

int(*cmp)(constvoid*,constvoid*b)){

inti;

*index=0;

char*p=(char*)arr;

char*tmp=p;

for(i=1;i<arr_size;i++){

if(cmp(tmp,p)>0){

tmp=p;

}

p+=arrmembersize;

}

(*index)=((int)(tmp-arr))/arrmembersize;

}

*/</span>

可以把指针看作是char*,如果转换为int*,那下面的位移就银姿哪不正确了.</span>

index<span>=</span>i<span>;</span>

<span>}</span>

<span>}</span>

<span>return</span>index<span>;</span>

<span>}</span>

<span>int</span>result<span>;</span><span>//result保存的是最小值索引.</span>

result<span>=</span>FindMin<span>(</span>arr,<span>12</span>,

㈢ C++模板和模板的特化,模板的扩展

模板的作用是实现类型通用,降低代码的冗余度。它可以为一种算法定义不同类型的版本。

实现机制:通过复制代码使用类型参数突破类型的限制,虽然丧失一定的类型安全,但模板需要实例化才能使用,实例化由编译器完成。

模板的分类包括函数模板和类模板。函数模板是带类型参数的函数,支持类型推断;而类模板则是带类型参数的类,不支持类型推断。

函数模板的语法是:template 返回值类型 函数模板名(形参列表) { …… }。调用时,函数模板名(实参); 如果类型参数可以通过实参判断,传递的类型可以省略。

类模板的语法是:template class 类模板名 { …… }。使用时,类模板名 对象;。

模板的特化用于重新定义某些特殊类型的行为。函数模板的特化语法是:template > 返回值类型 函数模板名(参数列表) { …… }。类模板的特化语法是:template > class 类模板名 { …… }。

类模板的成员特化可以是全类特化或局部特化。局部特化可以针对有多个类型参数的类模板,只特化其中一部分参数。

模板参数的默认值、非类型参数和模板参数模板是模板的高级特性。模板可以作为类模板或类的成员/友元,STL的实现使用了该语法。

类模板的继承可以通过语法实现,包括类继承类模板和类模板继承类模板。

模板的递归实例化是指使用类模板实例化后作为参数继续实例化本模板。

模板的划分用于将类的声明(模板的声明)写在头文件,类/类模板中的函数实现写在源文件,因为模板的实例化是在编译时完成的。

阅读全文

与编译的函数模版相关的资料

热点内容
ie文件夹禁止访问 浏览:543
百川互联网程序员 浏览:781
linuxpython解释器 浏览:665
兴安得力软件加密狗 浏览:490
智能网络摄像头加密 浏览:574
软件毕业程序员培训 浏览:650
安卓陀螺仪低怎么办 浏览:247
一级建造师复习题集pdf 浏览:903
法理学pdf海默 浏览:390
服务器内存储器是用什么的 浏览:819
微帮同城分类信息源码 浏览:808
安卓系统ad是什么 浏览:471
python输出中不加占位符 浏览:596
linux文件夹权限控制 浏览:730
雅虎邮箱怎么加密码 浏览:819
为什么安卓手机登录不了苹果账号 浏览:537
如何复制usb加密狗 浏览:801
哪个app看你微笑时很美 浏览:908
mac启动命令 浏览:602
ngc服务器是什么的简称 浏览:75