c ++中模板类的大小是多少?

时间:2017-01-29 08:12:59

标签: c++11 templates

以下代码的输出是16.为什么会这样?即使没有使用类的数组长度初始化大小为16并且使用第二个构造函数初始化长度,它也是相同的大小,即16。任何解释?

  #include <iostream>
    #include <string>
using namespace std;

template <class T>
class array1{
    T * arr;
    int l;
    public:
    array1(){
        arr = 0; l=0;
        }
    array1(int x){
        l = x;
        arr = new T[l];
    }
    ~array1(){
        delete[] arr;
        }
    void display(){
        cout << "array1 is :"<<endl;
        for (int i=0; i<l; i++)
        cout << arr[i] << " ";
        cout << endl;
    }

};

int main()
{
array1<int> a1;
cout << "size of int arr is " << sizeof(a1);
return 0;
}

3 个答案:

答案 0 :(得分:2)

这是因为Data Structure alignment。在您的系统中,它与8个字节的字对齐。打印sizeof(T*)sizeof(int),它将分别在8类的构造函数中输出4array。但是当输出一起时需要16个字节。

答案 1 :(得分:1)

看起来您的整数和指针类型都是8字节/ 64位。另外,只需要抬头,sizeof是一个编译时操作符,这意味着即使您的类型的对象使用operator new[]在堆上分配内存,sizeof仍将返回16类型为array1的任何对象的字节数。

此外,无论您对T使用何种类型,sizeof(array1<T>)始终为16个字节。 (我假设您没有针对非典型目标进行编译。)

答案 2 :(得分:0)

您的班级有两个成员变量。指针和int。我怀疑你的平台大小都是八个字节。

如果是,那么:8 + 8 = 16。

(你的类没有虚拟方法 - 所以没有vtable开销)。