3

假设,我们声明模板:

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

我的问题的目的是找出:
标准是否定义了在看起来像我给出的优化的情况下应该执行,所以我们可以简单地使用模板并依赖编译器?

4

2 回答 2

4

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

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

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

但是,此行为不是 Standard 强制要求的

于 2013-05-25T10:57:01.227 回答
0

该标准不要求在任何情况下进行优化。因此,对于您能想到的任何情况,您最后一个问题的答案是否定的。现在,在这种情况下,标准也不会阻止优化,我猜许多编译器会足够聪明地在这个简单的情况下做到这一点。

于 2013-05-25T11:01:17.937 回答