+ -
当前位置:首页 → 问答吧 → 关于非类型形参导致代码膨胀的问题

关于非类型形参导致代码膨胀的问题

时间:2011-11-28

来源:互联网

C/C++ code
#include <iostream>
#include <vector>
using namespace std;

//关于非类型形参导致的代码膨胀问题
/**template<class T,size_t N>
class base
{
    public:
    void invert();
    private:
    T mt[N];
};
template<class T,size_t N>
void base<T,N>::invert()
{
    //....省略对数组的转置
}**/
//对于这段代码来说,effective C++上说会导致code bloat,原因是非类型形参如果改成下面代码:
//--------------------------------------------------------------------
template<class T>
class base
{
    public:
    base(T *p):pt(p){}
    protected:
    void invert(size_t ix)
    {
        //....省略对数组的转置
        cout << "hello" << endl;
    }
    private:
    T *pt;
};
template<class T>
class derived:private base<T>
{
    public:
    derived(T *p,size_t it):base<T>(p),size(it){}
    using base<T>::invert;
    void invert()
    {
        this->invert(size);//调用基类的转置函数来实现
    }
    private:
    size_t size;
};
int main ()
{
    int im[10] = {5,4,6,2,4,5,6,7,9,41};
    derived<int> md(im,5);
    md.invert();
}

下面这个可以避免重复代码生成??费解,对于这个模板导致重复代码生成的问题很迷茫,网大牛们解释哈吧!

作者: qscool1987   发布时间: 2011-11-28

对上面那个来说不同的N相同的T都需要生成不同的类定义。但是下面的只要T相同就只有一份类定义

作者: pengzhixi   发布时间: 2011-11-28

引用 1 楼 pengzhixi 的回复:
对上面那个来说不同的N相同的T都需要生成不同的类定义。但是下面的只要T相同就只有一份类定义

你总是能一语中的,可是我感觉这样反而复杂了不少,如果对于一般的程序来说可读性不好,是类库的话那必须这么做

作者: qscool1987   发布时间: 2011-11-28

后面用动态内存分配代码并不复杂多少。反倒是你前面的那个版本让编译器编译的时候压力很大。

作者: pengzhixi   发布时间: 2011-11-28

只有用到的代码才会被编译。像数组反转这样会被内联的简单函数,对体积是没有影响的。

作者: mingliang1212   发布时间: 2011-11-28

引用 4 楼 mingliang1212 的回复:
只有用到的代码才会被编译。像数组反转这样会被内联的简单函数,对体积是没有影响的。


内联反而会导致代码膨胀

作者: pengzhixi   发布时间: 2011-11-28