c++ - C++:函数参数或模板参数
问题描述
我有一个类myclass
,它依赖于一些int
设置向量成员的大小。我可以将其实现为非类型模板参数
template<int sz>
class myclass {
...
或者
class myclass {
...
然后sz
在构造函数或其他类方法中简单地用作参数。
两者都可以在很多情况下工作。在其他一些情况下(例如,如果myclass
引用其他模板类或函数使用sz
作为非类型模板参数),则只有第一个选项有效。
在两者都可以工作的情况下,偏爱其中一个的可能原因是什么?
除了我未来的新编码之外,这也会影响我对已有代码的处理方式……是努力将一种实现类型“转换”为另一种,还是保持现状。
我不仅要询问差异(例如,编译时分配与运行时分配),还要询问这些差异如何使一个或另一个选项更可取。
解决方案
首先,重叠(“两者都可以工作”)比您想象的要小。您不能制作包含类模板的各种特化的容器(缺少类型擦除技巧)。任何myclass
用于参数或返回类型的函数,如果myclass
是模板,则必须命名一个特化或模板化自身。仅当大小是常量表达式时,即使是纯本地使用也会重叠。
如果这些问题都没有强迫您处理,那么也会对性能产生影响。使用类模板的多个实例化可能会增加二进制大小,尽管积极的内联可能会降低成本。使用运行时参数可能会引入额外的运行时开销,尽管积极的内联也可能会减少这种开销。您也无法避免使用单一类型进行堆分配(除非您施加最大容量——您总是为此付费)。
推荐阅读
- php - 在管理员中使用带有动态内容的 wordpress 厚框
- typescript - 在另一个包上使用类型声明
- go - 生成 micro-go 代码时出错 - --go_out: protoc-gen-go: unknown plugin "micro"
- python - Discord.py 不响应文字命令
- java - 弹簧靴 | 自动装配 CloseableHttpClient 失败 NoSuchBeanDefinitionException
- laravel-5 - 从控制器异步运行命令
- c# - c# - 将文件中的 10 行随机行(不重复)写入 15 个文件中的每一个
- phpspreadsheet - 找不到包 phpoffice/phpspreadsheet
- python-3.x - python中的self关键字用法?详细的解释就像你在解释一个孩子一样
- django - 如何在 django 中使用 mysql-connector mysql 适配器??/