模板的实例化会导致二进制代码重复吗,编译器会阻止吗?
Can instantiation of a template lead to a binary code duplication, does compiler prevent it?
假设声明模板:
template <class functor, int index>
class MyClass
{
public:
MyClass(){someFunction(index);}
private:
void someFunction(int index)
{
while(index--)
functor();
}
int commonFunction(void)
{
return M_PI;
}
};
注意方法commonFunction不依赖于模板形参。
客户端使用模板:
MyClass<func1,100> t1;
MyClass<func2,100> t2;
// ...
MyClass<funci,100> ti;
// where i, for example in 1 .. 1000
模板的实例化会导致commonFunction在二进制代码中的复制吗?
编译器能防止这种重复吗?
c++标准是否定义可以防止重复,因此每个编译器都应该提供优化?
class baseMyClass
{
int commonFunction(void)
{
return M_PI;
}
};
template <class functor, int index>
class MyClass : private baseMyClass
{
public:
MyClass(){someFunction(index);}
private:
void someFunction(int index)
{
while(index--)
functor();
}
};
但是我的问题的目的是找出:
标准是否定义在类似我给出的情况下应该执行优化,因此我们可以简单地使用模板并依赖编译器?
标准是否定义在类似我给出的情况下应该执行优化,所以我们可以简单地使用模板并依赖编译器?
不,标准不要求符合标准的编译器执行这种优化。代码膨胀是模板的缺点之一。
也就是说,因为你的函数除了返回一个常量之外什么都不做,所以它很可能会被内联,即使它不被内联,链接器也可能会识别出该函数的几个相同的实例已经生成,并将它们合并。
但是,这个行为并没有被标准强制。
该标准并未强制在任何情况下进行优化。所以你最后一个问题的答案是不对于任何你能想到的情况。现在,在这种情况下,标准也不会阻止优化,我想许多编译器将足够聪明,在这个简单的情况下做它。
相关文章:
- 为什么所有C++编译器都会崩溃或挂起此代码
- 为C++03编译器编写部分unique_ptr,该编译器与较新的编译器在公共代码库上运行
- 与其他编译器相比,相同的代码在工作室Microsoft提供不同的输出
- Visual Studio 中是否有来自代码块的编译器标志的类似物?
- C++ 代码的行为因编译器而异
- 代码未在联机编译器上显示结果
- 在 Azure DevOps 构建管道中使用英特尔C++编译器为 Linux 环境构建C++代码
- 编译器资源管理器(godbolt)如何安全地运行代码?
- 使用特征C++需要哪个代码块编译器?
- GCC 编译器是否应该对涉及 [[fallthrough]] 属性的格式错误的C++代码进行诊断?
- boost::spirit--试图编译大多数简单代码的编译器错误
- 使用其他编译器编译QT代码
- 使用 Mac 终端编译器编译 c++14 代码
- 我最近更改了编译器路径以运行 c++ 代码,但现在我无法运行任何 python 代码。我该如何解决这个问题?
- 编译器是否C++具有相同模板参数集的每个模板类实例生成代码?
- 为什么当我的代码超出函数范围时,"does not name a type"出现编译器错误?
- 如何获得代码::块的C++代码编译器?
- 编译器会自动优化重复代码吗?
- 数字火星编译器(代码::块)无法打开文件'iostream'
- 端口/重新编码真正大和旧的C++编译器代码到Qt或CLI/Mono