5

我的代码是:

#include <iostream>

using namespace std;


template <typename T, int X>

class Test
{
   private:
    T container[X];
   public:
    void printSize();

};
template <typename T, int X>
void Test<T,X>::printSize()
{
    cout <<"Container Size = "<<X <<endl;
}


int main()
{
    cout << "Hello World!" << endl;
    Test<int, 20> t;
    Test<int, 30> t1;

    t.printSize();
    t1.printSize();
    return 0;
}

问题:

  1. 会产生多少专业化?如果我理解正确,它会生成两个专业,一个是 for <int, 20> ,另一个是 for <int, 30>。如果我的理解有误,请纠正?
  2. 有没有办法查看/检查任何逆向工程生成的专业化数量?
4

3 回答 3

3

这里没有专业化,只有实例化这个问题解释了差异)。此代码生成类模板的两个实例Test

于 2013-04-18T08:13:03.580 回答
2

1) 是的,编译器会生成两个实例化,但是链接器可能会合并具有相同生成代码的函数(例如使用整个程序优化),这是减少代码膨胀的一种好方法。

2)看到这个问题,它解释了gcc如何生成模板实例化输出。

于 2013-04-18T08:13:03.023 回答
0

a)在您的示例中创建了 2 个专业化实例。

b)没有内置方法来支持为类生成的专业化数量。如果它是您的项目,您可以添加静态计数。如果你愿意,你可以为你的类编写你自己的引用计数机制。在我们的构造函数中增加静态计数。

static int created = 0;
static int alive = 0;
class Test
{
counter()
    {
        created++;
        alive++;
    }
~counter()
{
  created--;
}
//Rest of class
};
于 2013-04-18T08:20:25.390 回答