编译器可以对类似的模板类成员函数执行全局优化吗
Can a compiler perform global optimization on similar template classe member function?
我正在创建一个新容器。其模板参数之一是其初始容量。因此,创建具有不同初始容量的实例将导致编译器为每个模板化类生成相同的代码。
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()方法是否使用模板参数?如果没有,则可以将其因子化为非模板基类,模板类从该基类继承。
相关文章:
- 如何使用指针传递给函数的数组中对象的函数成员
- c++构造函数成员初始化:传递参数
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 如何在C++通过公共函数访问私有函数成员?
- 解释了构造函数成员初始化列表
- 调用std::函数成员时内存损坏
- 是否可以为模板类的模板函数成员设置别名?
- 捕获 lambda 函数C++成员变量
- 构造函数成员初始值设定项跨成员列出,安全吗?
- 获取与在模板参数中传递的函数成员类型相同的类
- 如何从公共函数成员访问地图私有成员
- C 构造函数成员分配优化
- 使用命名空间进行函数成员定义
- 函数成员作为 CUDA 内核的参数
- 模板基类函数成员的别名
- 函数成员中用于void和继承的enable_if
- 头文件中是否定义了一个很长的Class函数成员
- 类内/构造函数成员初始化
- 使用指向部分专用函数成员的指针自动填充向量
- 指向函数成员的指针