以下代码的输出是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;
}
答案 0 :(得分:2)
这是因为Data Structure alignment。在您的系统中,它与8个字节的字对齐。打印sizeof(T*)
和sizeof(int)
,它将分别在8
类的构造函数中输出4
和array
。但是当输出一起时需要16个字节。
答案 1 :(得分:1)
看起来您的整数和指针类型都是8字节/ 64位。另外,只需要抬头,sizeof
是一个编译时操作符,这意味着即使您的类型的对象使用operator new[]
在堆上分配内存,sizeof
仍将返回16类型为array1
的任何对象的字节数。
此外,无论您对T
使用何种类型,sizeof(array1<T>)
始终为16个字节。 (我假设您没有针对非典型目标进行编译。)
答案 2 :(得分:0)
您的班级有两个成员变量。指针和int。我怀疑你的平台大小都是八个字节。
如果是,那么:8 + 8 = 16。
(你的类没有虚拟方法 - 所以没有vtable开销)。