模板的实例化会导致二进制代码重复吗,编译器会阻止吗?

Can instantiation of a template lead to a binary code duplication, does compiler prevent it?

本文关键字:编译器 代码 实例化 二进制      更新时间:2023-10-16

假设声明模板:

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();
    }
};

但是我的问题的目的是找出:
标准是否定义在类似我给出的情况下应该执行优化,因此我们可以简单地使用模板并依赖编译器?

标准是否定义在类似我给出的情况下应该执行优化,所以我们可以简单地使用模板并依赖编译器?

不,标准不要求符合标准的编译器执行这种优化。代码膨胀是模板的缺点之一。

也就是说,因为你的函数除了返回一个常量之外什么都不做,所以它很可能会被内联,即使它不被内联,链接器也可能会识别出该函数的几个相同的实例已经生成,并将它们合并。

但是,这个行为并没有被标准强制。

该标准并未强制在任何情况下进行优化。所以你最后一个问题的答案是对于任何你能想到的情况。现在,在这种情况下,标准也不会阻止优化,我想许多编译器将足够聪明,在这个简单的情况下做它。