c++ - c++ 概念是否会导致编写模板实例化来构建输出?
问题描述
对于具有许多大型和复杂模板实例化的库,在我看来,决定是否使用概念的主要考虑因素之一是构建输出的大小是否更小。
对于 SFINAE,我的理解是以下代码将导致模板实例化std::is_function<bar>
并std::enable_if<true, bool>
包含在构建输出中,从而增加其大小(尽管在本示例中略有增加):
#include <type_traits>
template<typename F,
typename = std::enable_if_t<
std::is_function<F>::value,
bool> = true>
void foo(F& f)
{
// do some stuff with f
}
void g();
int main()
{
foo(g);
return 0;
}
如果改为使用基于 C++20 的概念std::is_function
,显然必须实例化模板来检查它。但是那个实例化然后被写入最终的构建输出吗?这是否因编译器实现而异?
#include <type_traits>
template<typename F>
concept Function = std::is_function<F>::value;
template<Function F>
void foo(F& f)
{
// do some stuff with f
}
//...
解决方案
您似乎担心代码大小。
类,在这里我包括类模板的实例化,只是编译器知道的抽象信息片段。它们不会影响代码大小。
只有函数(包括成员函数)会影响代码大小。类模板的成员函数仅在它们被实例化时才会影响代码大小,因为它们的使用方式需要它(C++ 标准将其称为“ ODR-used ”)。
std::is_function
在您的示例中, and的任何成员函数都没有std::enable_if
被 ODR 使用,因此它们没有被实例化,并且它们不会影响代码大小。
但是那个实例化然后被写入最终的构建输出吗?
不生成代码。但通常编译器会将调试信息写入输出。从这个意义上说,有些东西被写入输出。
这是否因编译器实现而异?
就调试信息而言:是的。但是是否发生实例化是由语言的规则决定的,编译器之间应该没有区别。
推荐阅读
- php - 无法将选定的复选框值与 livewire 组件绑定
- r - rmarkdown ggplot tufte 主题背景色
- arrays - 使用标准对工作计划中的数据进行水平汇总
- node.js - 在“TypeScript”中使用 node-config 的 deferConfig 时“无法读取属性”
- xamarin - MvxRecyclerView 和 HttpClient.SendAsync
- next.js - 在 NextJs 的 getServerSideProps 方法中获取客户端 IP
- powerbi - Power BI 中的行格式设置
- jq - 如何使用 JQ 计算字段的 mod 哈希?
- r - 如果它们不是字母/数字,如何删除最后/第一个字符?
- c - 使按钮网格固定宽度和高度,并换行