Nun, sizeof ist zum einen ein Operator, und zum anderen kann er aber nicht überladen werden (welche Operatoren noch nicht überladen werden können: http://www.devx.com/tips/Tip/12681).
Bei sizeof bei komplexen Typen wie Klassen und Strukturen ist darauf zu achten, dass der Compiler keine Füllbits einfügt. Sonst könnte man sich schonmal über die Größe die sizeof zurückgibt wundern.
sizeof auf eine Array anzuwenden, geht schon, allerdings nur auf welche, die auf dem Stack liegen. Auf dem Heap würde die Größe des Elementzeigers zurückgegeben werden.
|
C-/C++-Quelltext
|
1
2
|
int* ptr_array_heap(new int[10]);
std::cout << sizeof (ptr_array_heap) << "\nint* ^= " << sizeof(int*) << std::endl;
|
Dadurch das sizeof bei Arrays auf dem Stack deren vollständige Größe zurück gibt:
|
C-/C++-Quelltext
|
1
2
|
char sample[10];
std::cout << sizeof(sample) << " == sizeof(char) * size = " << sizeof(char) * 10 << std::endl;
|
Kann man durch einen einfachen Trick die Anzahl der Elemente des Stack-Arrays herausbekommen.
|
C-/C++-Quelltext
|
1
|
#define array_size(x) sizeof(x) / sizeof(x[0])
|
D.h. die gesamte Größe durch die Größe eines Elementes.
Die Dateigröße ist wieder etwas ganz anderes:
|
C-/C++-Quelltext
|
1
2
3
4
5
|
const std::streamsize file_size(const char* file_name)
{
std::ifstream file_stream(file_name, std::ios_base::binary | std::ios_base::app);
return static_cast<std::streamsize>(file_stream.tellg());
}
|
sollte schon reichen.