2017-01-29 8 views
0

以下のコードの出力は16です。なぜそうですか?クラスの配列の長さで初期化しなくてもサイズは16であり、2番目のコンストラクタで長さを初期化すると同じサイズ、つまり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

これはテンプレートとは関係がありません。通常のクラスでは同じことが起こります。 – Mat

+4

なぜそれが16以外のものになるべきかについて私たちにあなたの前提を教えてもらえますか? –

+0

あなたは何を期待しましたか? –

答えて

0

クラスには2つのメンバー変数があります。ポインタとint。あなたのプラットフォームでは、どちらも8バイトのサイズであると思われます。

そうな場合:8 + 8 = 16

は(あなたのクラスには仮想メソッドがありません - ありませんのでvtableのオーバーヘッドが)。

+0

この質問にC++ 11でタグ付けしたので、次のことを確認することもできます: 'cout <<" sizeof arr、lは "<< sizeof a1.arr <<" + "<< sizeof a1.l << endl; – geipel

2

Data Structure alignmentのためです。あなたのシステムでは、それは8バイトワードに整列されています。 sizeof(T*)sizeof(int)を印刷すると、それぞれ84がコンストラクタarrayクラスに出力されます。しかし、一緒に出力すると16バイトかかります。

1

整数型とポインタ型は8バイト/ 64ビットです。また、先頭にあるsizeofはコンパイル時の演算子です。つまり、型のオブジェクトがoperator new[]でヒープ上にメモリを割り当てても、array1のオブジェクトに対してはsizeofが16バイトを返します。

また、Tのタイプにかかわらず、sizeof(array1<T>)は常に16バイトです。 (私はあなたが非定型ターゲットでコンパイルしていないと仮定しています)

関連する問題