返回完整目录

1.6 但是为什么不...? But, Should't We ...?

可能,甚至简单的函数模板可能引发进一步的疑问,这些疑问可能如此常见,所以在此简单地进行讨论。

1.6.1 传值还是传引用? Pass by Value or by Reference?

读者可能疑惑,为什么截止目前为止声明的函数使用传值方式而非传引用方式传递参数。除了一些拷贝代价小的简单类型(如基本类型(fundamental types)或者std::string_view),通常推荐以引用方式进行参数传递,因为没有非必要拷贝被创建。

然而,由于一些原因,值传递方式通常更好:

  • 语法更简单

  • 编译器更好优化

  • 移动语义(move semantics)使得拷贝成本更低

  • 有时根本没有拷贝或者移动问题

此外,对于模板来说会掺杂一些特殊的方面:

  • 模板可被用于简单和复杂的类型,所以选择适用于复杂类型的方式可能导致简单类型效率低下(counter-productive)

  • 调用者依然可以决定使用值传递还是引用传递,通过使用std::ref()std::cref(),详见第7.3节

  • 尽管对于传递字符串字面值(string literal)或者裸数组(raw arrays)总是问题,以引用方式传递他们通常会导致更大的问题。

这些都将在第7章中进行详细讨论。此刻,在本书中通常使用传值方式进行参数传递,除非一些功能只能使用引用。

1.6.2 为什么不使用inline? Why Not inline?

通常,函数模板不需要声明为inline。与普通非inline函数不同,非inline函数模板可以定义在头文件中,并且可以在多个解释单元(translate units)包含此头文件。

该规则的唯一例外是模板针对某些类型的全特化(full specialization),因此得到的代码不再是泛型(generic)的(所有的模板参数均已定义)。更多细节参考9.2节。

从一个严格的语言定义角度来看,inline仅仅意味着一个函数的定义可以在一个程序中出现多次。然而,这也意味着给编译器一个提示:对该函数的调用应当内联地展开(expanded inline)。在某些情形下,如此做可以产生更高效的代码,但是在其他情形下却完全相反。当今,在没有指定inline的情形下,编译器通常能更好地决定是否内联展开。然而,在该决策过程中,编译器依然对出现inline的情形负责(compilers still account for the presence of inline in that decision)。

1.6.3 为什么不使用constexpr? Why Not constexpr?

自从C++11起,可以使用constexpr来提供在编译期使用代码计算值的能力。对许多模板来说,这非常有意义。

比如,为了在编译期能够计算最大值函数,可以这样声明:

// basics/maxconstexpr.hpp

template<typename T1, typename T2>
constexpr auto max(T1 a, T2 b)
{
return b < a ? a : b;
}

该模板函数可以被用于需要编译期计算的地方,比如当声明裸数组的大小:

      int a[::max(sizeof(char), 1000u)];

或者声明std::array<>的大小:

      std::array<std::string, ::max(sizeof(char), 1000u)> arr;

此处,1000作为unsigned int来避免在模板中“比较有符号和无符号数比较”的警告。

第8.2节将讨论使用constexpr的其他例子。然而,为了将注意力放在基本问题上,当讨论其他模板特性时,通常会跳过constexpr。

C++ Templates (1.6 但是为什么不...? But, Should't We ...?)的更多相关文章

  1. 解决Windows版Git出现templates not found的问题

    环境: Win10 x64 Git windows客户端(下载自 https://git-scm.com/) SourceTree 1.9.6.1(使用系统安装的Git,而非SourceTree内嵌的 ...

  2. [c++] Templates

    Template是编译时多态.所有的模板都是在编译时产生对应的代码,它没有面向对象中的虚表,无法实现动态多态. Function Template A function template is a p ...

  3. webstrom live templates

    javascript: 在live templates底部要选择javascript # $('#$END$') $ $($end$) $bd $(document.body) $d $(docume ...

  4. Myeclipse Templates详解(一) —— Java模板基础

    目录 Templates简介 MyEclipse自带Templates详解 新建Template 自定义Template 因为自己比较懒,尤其是对敲重复代码比较厌恶,所以经常喜欢用快捷键和模板,Mye ...

  5. Using FreeMarker templates (FTL)- Tutorial

    Lars Vogel, (c) 2012, 2016 vogella GmbHVersion 1.4,06.10.2016 Table of Contents 1. Introduction to F ...

  6. juqery模板 Templates

    现在已经有了许多JavaScript的解决方案模板,从这方面说,标准化的模板解决方案必然是大势所趋.在本节中,我们向你简要描述四个最流行最有趣的模板.现有的模板解决方案能解决什么?那些特色在jQuer ...

  7. django TEMPLATES

    ?: (1_8.W001) The standalone TEMPLATE_* settings were deprecated in Django 1.8 and the TEMPLATES dic ...

  8. django复习笔记3:urls/views/templates三板斧

    0.先看看文件结构 mysite/ mysite/ ├── __pycache__ │   └── manage.cpython-.pyc ├── blog │   ├── __init__.py │ ...

  9. Effective C++ -----条款44:将与参数无关的代码抽离templates

    Templates生成多个classes和多个函数,所以任何template代码都不该与某个造成膨胀的template参数产生相依关系. 因非类型模板参数(non-type template para ...

  10. 第三节:视图(Views)和模板(Templates)

    目录 概览 编写视图 编辑视图实际做一些事情 抛出404异常 使用模板系统 移除在代码中的硬编码网址 Url名称的命名空间 概览 视图是Django应用的网页的“类型”,一般服务于特定的功能并且有特定 ...

随机推荐

  1. CSMA/CD ,现在的交换式以太网还用吗?谈全双工,半双工与CSMA/CD的关系

    我们知道:以太网访问控制用的是CSMA/CD,即载波侦听多点接入/ 冲突检测,是以广播的方式将数据发送到所有端口: 我们还知道:交换机能主动学习端口所接设备的MAC地址,在获知该端口的MAC 地址后, ...

  2. python爬虫实践——爬取“梨视频”

    一.爬虫的基本过程: 1.发送请求(请求库:request,selenium) 2.获取响应数据()服务器返回 3.解析并提取数据(解析库:re,BeautifulSoup,Xpath) 4.保存数据 ...

  3. jmeter单接口和多接口测试

    @@@@@@@@@@@@@@@ # 路漫漫其修远 最近接触到了多接口串联,接口串联的技术会在其他帖子有说明,其核心技术点就是通过正则表达式和变量来实现接口的关联.目前为止呢笔者用到的地方还只有一个,就 ...

  4. matplotlib常用基础知识

    linestyle(ls)线型参数表 常用color(c)参数表 marker标记符号表 plt常用方法表 plt.legend(loc=0)用于显示图例,图例的位置参数loc matplotlib常 ...

  5. PHP 标量类型与返回值类型声明

    标量类型声明 默认情况下,所有的PHP文件都处于弱类型校验模式. PHP 7 增加了标量类型声明的特性,标量类型声明有两种模式: 强制模式 (默认) 严格模式 标量类型声明语法格式: declare( ...

  6. P4383 [八省联考2018]林克卡特树 树形dp Wqs二分

    LINK:林克卡特树 作为树形dp 这道题已经属于不容易的级别了. 套上了Wqs二分 (反而更简单了 大雾 容易想到还是对树进行联通情况的dp 然后最后结果总和为各个联通块内的直径. \(f_{i,j ...

  7. 2019 HL SC day1

    今天讲的是图论大体上分为:有向图的强连通分量,有向图的完全图:竞赛图,无向图的的割点,割边,点双联通分量,变双联通分量以及圆方树 2-sat问题 支配树等等. 大体上都知道是些什么东西 但是仍需要写一 ...

  8. CF R 635 div2 1337D Xenia and Colorful Gems 贪心 二分 双指针

    LINK:Xenia and Colorful Gems 考试的时候没想到一个很好的做法. 赛后也有一个想法. 可以考虑答案的样子 x,y,z 可以发现 一共有 x<=y<=z,z< ...

  9. Jdbc与Dao和Javabean的区别

    JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口 ...

  10. api接口返回动态的json格式?我太难了,尝试一下 linq to json

    一:背景 1. 讲故事 前段时间和一家公司联调api接口的时候,发现一个奇葩的问题,它的api返回的json会动态改变,简化如下: {"Code":101,"Items& ...