new
在模板类的构造函数中使用关键字分配内存时,有一些非常奇怪的行为:
与未模板化的代码相比,该程序的执行速度非常慢。
为了证明这一点,我做了一个最小的错误复制示例程序:
using namespace std;
template<class tempT>
struct templatedClass{
double* y;
templatedClass() {
y=new double[(int)1E6];
}
~templatedClass() {
delete y;
}
};
class dummy {};
struct nontemplatedClass{
double* y;
nontemplatedClass() {
y=new double[(int)1E6];
}
~nontemplatedClass() {
delete y;
}
};
int main() {
for(int c=0;c<4000;c++) {
templatedClass<dummy>* A=new templatedClass<dummy>();
//nontemplatedClass* A=new nontemplatedClass();
delete A;
}
return(0);
}
使用 g++ 编译它。我的编译器版本是 g++ (Debian 4.7.2-4) 4.7.2
据我了解,模板不应该对程序执行的性能产生任何重大影响,即在运行时模板类的代码甚至不应该与不使用模板的专用类不同。
另外值得注意的是,当使用malloc
而不是new
没有性能差异时,一切都运行良好。
所以毕竟这对我来说似乎是 g++ 中的一个错误。
ps 我在使用 valgrind 时在更复杂的代码中发现了这种行为。为 valgrind 欢呼!