使用c++模板的优点和缺点

2023-05-16

作为C++语言的新组成部分,模板引入了基于通用编程的概念。通用编程是一种无须考虑特定对象的描述和发展算法的方法,因此它与具体数据结构无关。但在决定使用C++模板之前,让我们分析一下使用模板的优缺点。

目的:
当被问及引入C++模板的目的时,C++的发明者Bjarne Stroustrup告诉我“这是为了支持类型安全、类容器的有效性和算法的通用性”。

优势和劣势:
使用模板有很多原因,最主要的为了得到通用编程的优点。国际标准化组织(ISO)为C++建立了C++标准库,该标准库功能强大,这证明了模板的重要性。库中涉及算法和容器的部分组成了标准模板库(简称STL)。由于模板的可重用性和可扩展性,你可以利用STL来实现效率很高的代码。

但是模板也有一些不太为人知的缺点。首先,由于C++没有二进制实时扩展性,所以模板不能像库那样被广泛使用。模板的数据类型只能在编译时才能被确定。因此,所有用基于模板算法的实现必须包含在整个设计的头文件中。通过分析标准模板库(STL)的头文件,你可以很清楚的认识到这一点。

另外,由于模板只是最近加入C++标准中,所以有些C++编译器还不支持模板,当使用这些编译器时编译含有模板的代码时就会发生不兼容问题。例如,Mozilla浏览器开发组之所以没有使用模板就是因为交叉平台会导致模板的不兼容。同样的,如果当开发者需要跨越好几个平台而有的平台可能只有老的C++编译器的时候,使用模板也是不明智的。

即使到现在,模板的一些高级特性,例如局部特殊化和特殊化顺序在不同的C++标准实现中也还是不统一的。

尽管如此,结合STL使用模板还是可以大大减少开发时间。模板可以把用同一个算法去适用于不同类型数据,在编译时确定具体的数据类型。

比方说,假设你希望实现一个诸如TCP/IP堆栈所用的开窗重排序机制。这个机制可用于IP数据报和其它数据报格式。通过使用模板后,开窗重排序机制就像流控制那样,无须随所处理数据格式而改变。


C++模板的标准用法


头文件和名字空间

标准C++包含了名字为std的名字空间的所有标准库和函数。下文中例子将使用与它们相关联的头文件:

#include
using namespace std;

这里,我们包含了 iostream库在全局范围内说明了std名字空间。

说明、例化和参数化模板类:

第一件要考虑的事是如何定义一个简单的模板。我们假定你有C++的基本知识但是从没有接触过类属编程和模板。在清单A中,我们说明了一个模板。在清单B中,我们建立了一个实例来调用这个函数。

清单B中,foo模板的第一个实例将输出bar 97,第二个实例将输出bar a。这是因为模板是在编译时被解释的。与之相比,C++中类的数据类型必须在说明时就精确指定。

说明和参数化模板函数:

C++也可以说明模板函数。当编写一个处理对象的数据类型又很多种的算法时,模板函数的概念就显得很重要。我们将举一个模板函数的例子。

在In 清单C中,你会发现函数的定义兼有标准C(ANSI C)和模板类的特点。我们可以用不同的参数来调用这个函数,如清单D代码所示。

清单D中,第一个被调用的函数将输出b,这是因为参数是字符型。而第二个函数的参数是整数型,所以输出是98。

C++模板还有更多的标准用法,如模板参数、类型等价、模板重载等。参考书目覆盖了上述内容。我们就不再予以讨论。


C++模板的高级用法:模板元程序

 

模板在编译时例化的特点有一个不太引人注意的用法。该方法的技巧源于模板元程序这一概念上的。从本质上来说,这是利用模板在编译时例化的结果用在程序运行时的特点把运行时的部分工作编译到编译时的工作。这将在下面具体说明。

清单E 举了一个用以说明如何利用模板元程序的简单例子。例子在编译时,会计算出斐波纳契数列的值,这样就无需在程序运行时计算,减轻了运行时的工作量。斐波纳契数列的第零个和第一个元素分别为0和1,后续元素的值为该元素前两个元素的和:即、、,其中。斐波纳契数列为:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 ...

当编译清单E中的代码时,编译器将计算出的值,即55。

值得注意的是上面例子的编写利用模板特点。

表达式模板是模板的另一个高级用法。它利用数学表达式在编译时计算出结果的特点产生了运行时的高效代码。

结论:
模板是C++标准中相当重要的一部分,它是通用编程成为现实的理想方法。模板还有在编译时被解释的特点。模板是对迅速解决复杂问题有效手段,特别是标准模板类库。以前由于编译器不支持而导致了模板的可移植性发面的问题的出现。现在,国际标准(ANSI/ISO)已经出台,编译器开始按这个标准支持模板了,这个问题即将解决。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用c++模板的优点和缺点 的相关文章

  • RTOS关于SysTickHandler()

    我们知道FREERTOS会自动装载PendSV Handler 和SVC Handler 函数 xff0c 这里我们希望自己对其从新定义 xff0c 故做如下处理 include 34 delay h 34 include 34 sys h
  • STM32 正点原子学习(个人学习)

    系统执行一般只设置一次优先级分组 设置好之后不再改变 xff0c 不然会导致混乱 抢占优先级先进行判断响应优先级后 xff0c 同级别抢占优先级但高级别的响应优先级也不能打断同级别抢占优先级低级别的响应优先级 系统中断优先级分组函数 xff
  • Spring AOP使用案例

    AOP 原理 代理模式 需求背景 返回前端的用户信息包含手机号等敏感内容 xff0c 并在系统上已经有大量接口 现拿到需求 xff0c 需要在返回前端的对象中 xff0c 找到手机号的属性并将手机号加密 现状 xff1a 分散在各处的接口中
  • 【JVM】说一下jvm运行时数据区域

    说一下jvm运行时数据区域 文章目录 说一下jvm运行时数据区域程序计数器栈本地方法栈堆方法区运行时常量池直接内存 本篇文章总结自 深入理解Java虚拟机 程序计数器 程序计数器是一块较小的内存空间 xff0c 它可以看作是当前线程所执行的
  • ffmpeg错误总结

    av err2str 在C 43 43 项目中 xff0c 使用FFmpeg中的av err2str函数时 xff0c 报错 解决 xff1a 调用该函数的文件开始加上以下代码 xff1a span class token keyword
  • 【JVM】垃圾回收算法

    垃圾回收算法 文章目录 垃圾回收算法标记 清除算法标记 复制算法Appel式回收 标记整理算法混合使用 标记 清除算法 标记 清除算法是最早出席那也是最基础的垃圾收集算法 xff0c 是1960年由Lisp之父John McCarthy所提
  • 【JVM】如何判决一个对象的生死

    如何判决一个对象的生死 文章目录 如何判决一个对象的生死如何判断对象是否存活 xff08 应该被回收 xff09 引用计数法可达性分析算法引用生存还是死亡 如何判断对象是否存活 xff08 应该被回收 xff09 引用计数法 很多教科书判断
  • 【大前端】vue,jq,uniapp ajax默认的请求格式

    vue jq uniapp ajax默认的请求格式 文章目录 vue jq uniapp ajax默认的请求格式常见的内容类型 xff08 content type xff09 jq默认请求格式默认内容类型 xff1a multipart
  • 【大前端】uniapp上传图片

    uniapp上传图片 看本篇文章之前建议看下本篇文章 直接上代码 uni chooseImage success chooseImageRes 61 gt 获取文件的路径 const tempFilePaths 61 chooseImage
  • 【JavaWeb】el表达式与jstl标签的使用

    el表达式与jstl标签的使用 el表达式 简介 el表达式的全称 xff1a Expression Language 是表达式语言 EL表达式的作用 xff1a EL表达式主要是代替jsp页面中的表达式脚本在jsp页面中进行数据的输出 因
  • 【Java】说说Java的线程池

    说说Java的线程池 文章目录 说说Java的线程池为什么要使用线程池ThreadPoolExecutor提供的构造方法解析 线程池处理流程 为什么要使用线程池 创建 销毁线程需要消耗系统资源 xff0c 线程池可以复用已创建的线程控制并发
  • 【Java】Java的类加载器和双亲委派模型

    文章目录 类加载器双亲委派模型 类加载器 对于任意一个类 xff0c 都必须由加载它的类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性 xff0c 每一个类加载器 xff0c 都有一个独立的类名称空间 比较两个类是否 34 相等
  • 【git】说说git的基础命令

    git的基础命令 命令名称作用git config global user name 用户名设置用户签名git config global user email 邮箱设置用户签名git init初始化本地库git status查看本地库状态
  • 【maven】maven基础知识入门

    maven 文章目录 maven什么是maven为什么使用maven项目构建过程的几个主要环节maven核心概念如何通过坐标到仓库中查找jar包 什么是maven Maven 是 Apache 软件基金会组织维护的一款自动化构建工具 xff
  • 【spring】说说spring的IOC与DI

    说说spring的IOC与DI 文章目录 说说spring的IOC与DIid属性和name属性标签scope Bean的作用范围Spring xff0c 配置生成Bean的三种方式Sping 的 Bean属性注入Sping的Bean属性通过
  • ffmpeg时间戳相关函数

    1 概述 ffmpeg中与时间戳相关的函数主要有 xff1a av rescale q xff0c av rescale q rnd xff0c av compare ts av rescale q span class token cla
  • 【计算机网络】网线规格的鉴别与接线方法

    网线规格的鉴别与接线发送 文章目录 网线规格的鉴别与接线发送一 怎么判断网线类型 xff1f 二 制作网线标准三 屏蔽类型四 使用场景五 米数标记接线方法 一 怎么判断网线类型 xff1f 可以根据网线外皮的标识来判断 xff0c 正规厂商
  • 【Java】说说spring-jdbc和spring事务管理

    文章目录 说说spring jdbc和spring事务管理spring jdbc1 配置数据源2 使用jdbcTemplete3 在dao层使用jdbcTemplete 外部配置方式新建配置文件jdbc properties修改数据源配置部

随机推荐

  • 【微服务】springcloud-dubbo,springCloudAlibaba服务调用使用dubbo

    springcloud dubbo xff0c springCloudAlibaba服务调用使用dubbo 文章目录 springcloud dubbo xff0c springCloudAlibaba服务调用使用dubbo添加依赖配置具体
  • 【项目实战】spring boot中使用webSocket

    spring boot中使用webSocket 文章目录 spring boot中使用webSocket引入依赖支持配置类接口类前端连接方式前端信息发送方式 引入依赖 需要在基础的spring boot web项目项目中添加下面一个依赖 x
  • 【项目复盘】springboot项目中使用mybatis-plus进行分页

    springboot项目中使用mybatis plus进行分页 文章目录 springboot项目中使用mybatis plus进行分页引入依赖配置类实体类持久层业务层 引入依赖 span class token generics span
  • 【项目复盘】javax.validation的简单使用

    javax validation的简单使用 javax validation需要与hibernate validator配合使用 validation bean 是基于JSR 303标准开发出来的 xff0c 使用注解方式实现 xff0c
  • 【项目复盘】springboot中使用swagger生成接口文档并配置bootstrap主题

    springboot中使用swagger生成接口文档并配置bootstrap主题 引入依赖 span class token generics span class token punctuation lt span dependency
  • 【项目复盘】微服务网关GateWay过滤

    微服务网管过滤 新建一个过滤类 span class token annotation punctuation 64 Component span span class token comment 过滤器的执行优先级 返回值越小 执行优先级
  • 【项目实战】Winodws下使用ELK搭建日志分析框架

    项目实战 Winodws下使用ELK搭建日志分析框架 ELK是什么 xff1a 引用官网的一句话 xff1a 核心产品包括 Elasticsearch Kibana Beats 和 Logstash xff08 也称为 ELK Stack
  • java_网络编程知识

    day11 网络编程 主要内容 软件架构CS xff0f BS网络通信三要素TCP通信Socket套接字ServerSocket 学习目标 能够辨别UDP和TCP协议特点 能够说出TCP协议下两个常用类名称 能够编写TCP协议下字符串数据传
  • AvFrame和AvPacket

    在FFmpeg中 未压缩的图像和压缩的视频码流分别使用AVFrame结构和AVPacket结构保存 针对视频编码器 其流程为从数据源获取图像格式的输入数据 保存为AVFrame对象并传入编码器 从编码器输出AVPacket结构 1 AVFr
  • 基于FreeRTOS的stm32程序初始化底层搭建(hal库)

    采用嵌入式实时操作系统 RTOS 可以更合理 更有效地利用CPU的资源 xff0c 简化应用软件的设计 xff0c 缩短系统开发时间 xff0c 更好地保证系统的实时性和可靠性 FreeRTOS是一个迷你的实时操作系统内核 作为一个轻量级的
  • ceres小结 -- vins为例

    从 typora 复制的 排版有问题 见谅 在estimator cpp文件里 这个函数 void Estimator optimization 1 声明problem ceres Problem problem 2 引入核函数loss f
  • JavaScript操作表格及CSS样式

    概述 在前端开发中 xff0c 表格主要用于存储结构化的数据 xff0c CSS主要用于修饰DOM元素 xff0c 如何通过DOM来操作表格及CSS呢 xff1f 本文主要通过一些简单的小例子 xff0c 简述DOM对表格和CSS的常见操作
  • 转:Git Submodule管理项目子模块

    使用场景 当项目越来越庞大之后 xff0c 不可避免的要拆分成多个子模块 xff0c 我们希望各个子模块有独立的版本管理 xff0c 并且由专门的人去维护 xff0c 这时候我们就要用到git的submodule功能 常用命令 span c
  • Linux/c++服务器开发方向的重点

    作者 xff1a NULL 链接 xff1a https www zhihu com question 37247264 answer 2352680534 来源 xff1a 知乎 著作权归作者所有 商业转载请联系作者获得授权 xff0c
  • Prometheus之Dockerfile编写、镜像构建、容器启动

    Python微信订餐小程序课程视频 https edu csdn net course detail 36074 Python实战量化交易理财系统 https edu csdn net course detail 35475 目录 从官方镜
  • Java的接口调用

    最近在观看一个Android开发中 xff0c 有一个问题百思不得其解 xff0c 就是从Fragment传数据回Activity和Activity传数据到Fragment中 xff0c bundle其实刚开始还是理解的 xff0c 但是当
  • X86实模式与保护模式简介

    0 引言 从80386开始 xff0c CPU有三种工作方式 xff1a 实模式 xff0c 保护模式和虚拟8086模式 v86模式 只有在刚刚启动的时候是real mode xff0c 等到操作系统运行起来以后就切换到protected
  • (1)VisDrone无人机目标检测数据集介绍

    数据集介绍 官网 xff1a http aiskyeye com VisDrone数据集 xff0c 包含了10个类 xff08 即行人 人 汽车 面包车 公共汽车 卡车 汽车 自行车 遮阳三轮车和三轮车 xff09 无人机计算机视觉相关检
  • 简单的shell编程的语法

    shell 1 span class token punctuation span 脚本以 span class token comment bin bash 开头 span span class token comment 脚本的常用执行
  • 使用c++模板的优点和缺点

    作为C 43 43 语言的新组成部分 xff0c 模板引入了基于通用编程的概念 通用编程是一种无须考虑特定对象的描述和发展算法的方法 xff0c 因此它与具体数据结构无关 但在决定使用C 43 43 模板之前 xff0c 让我们分析一下使用