2017-01-29 7 views
0

Die Ausgabe des folgenden Codes ist 16. Warum so? sogar ohne Initialisierung mit der Länge des Arrays der Klasse ist die Größe 16 und mit der Initialisierung der Länge mit dem zweiten Konstruktor ist es die gleiche Größe, d.h. 16. Jede Erklärung?Größe der Vorlagenklasse

#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

Das hat nichts mit Vorlagen zu tun, Sie werden das gleiche mit einer normalen Klasse bekommen. – Mat

+4

Können Sie uns Ihre Annahmen mitteilen, warum es etwas anderes als 16 sein sollte? –

+0

Was hast du erwartet? –

Antwort

0

Ihre Klasse hat zwei Mitgliedsvariablen. Ein Zeiger und ein int. Ich vermute, dass beide für Ihre Plattform acht Byte groß sind.

Wenn ja, dann: 8 + 8 = 16.

(Ihre Klasse hat keine virtuellen Methoden - also keine Vtable-Overhead).

+0

Da Sie diese Frage mit C++ 11 markiert haben, können Sie dies auch überprüfen: 'cout <<" Größe von arr, l ist "<< sizeof a1.arr <<" + "<< sizeof a1.l << endl;' – geipel

2

Es ist wegen Data Structure alignment. In Ihrem System wird es auf 8 Bytes Wort ausgerichtet. Drucken Sie die sizeof(T*) und sizeof(int) es wird 8 und 4 jeweils im Konstruktor array Klasse ausgeben. Aber wenn es zusammen ausgegeben wird, benötigt es 16 Bytes.

1

Es scheint, dass Ihre Integer- und Zeigertypen beide 8 Bytes/64 Bits sind. Nur ein Kopf hoch, sizeof ist ein Kompilierzeit-Operator, was bedeutet, dass selbst wenn ein Objekt Ihres Typs Speicher auf dem Heap mit dem operator new[] reserviert, sizeof immer noch 16 Bytes für jedes Objekt des Typs array1 zurückgeben.

Zusätzlich, egal welchen Typ Sie für T haben, sizeof(array1<T>) wird immer 16 Bytes sein. (Ich nehme an, dass Sie nicht auf einem atypischen Ziel kompilieren.)

Verwandte Themen