编译器可以对类似的模板类成员函数执行全局优化吗

Can a compiler perform global optimization on similar template classe member function?

本文关键字:函数 成员 执行 全局优化 编译器      更新时间:2023-10-16

我正在创建一个新容器。其模板参数之一是其初始容量。因此,创建具有不同初始容量的实例将导致编译器为每个模板化类生成相同的代码。

MyVector<3> firstVector;
MyVector<4> secondVector;
...
if (firstVector.empty() && secondVector.empty())
{
   ...
}

此代码段将导致编译器为这两个类生成empty()。编译器能消除这种冗余吗?

首先,empty()可能非常简单,编译器可以内联它。如果is不能内联怎么办?编译器可以进行任何类型的合并,但必须以不同函数具有不同地址的方式进行:

&MyVector<3>::empty() != &MyVector<4>::empty()

Visual C++10在这里可能会表现出非标准的行为,这取决于链接器的设置——在某些设置中,它会检测到这些函数并将它们合并,从而违反标准。我从未见过它以符合标准的方式进行这样的消除。

编译器可能并没有消除这一点。考虑以下示例:

template<size_t CAPACITY>
class MyVector {
...
public:
  bool empty() const { static int i = CAPACITY; return ...; }
};

在上面的情况下,您可以看到每个MyVector<N>::empty()都必须是唯一的,因为static int i应该是函数的独占。即使static int不存在,编译器也将始终假设它的可能性。因此,如果生成empty()的副本,则会为所有版本生成该副本。

我是在理论上回答。不知道编译器是否有一些实用的优化技术,可以克服这些问题。

但是,如果你的MyVector看起来像这样:

template<size_t CAPACITY, typename T>
class MyVector : public vector<T>
{
  // using vector<T>::empty;
};

然后,只生成一个副本。

empty()方法是否使用模板参数?如果没有,则可以将其因子化为非模板基类,模板类从该基类继承。