2

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 欢呼!

4

1 回答 1

0

如前所述Zeta,一个可能的问题是您正在使用newthen delete。这意味着,您可能存在内存泄漏。

您会发现(合法的)建议delete用于分配的内存newdelete[]分配的内存new[]......但问题的真相是您不应该调用deleteordelete[]自己,而是依靠智能指针或容器来处理内存释放。

在您的情况下,您应该使用std::vector<double>而不是double*例如。

然后,正如 Andy 所说,基准优化构建;否则毫无意义。

于 2013-03-29T11:13:47.670 回答