Una pregunta que surge a menudo en seminarios es «¿Cómo de
grande es un objeto y qué pinta tiene?» La respuesta es
«más o menos lo que esperas de un struct
en
C». De hecho, el código que produce el compilador de C para
un struct
C (sin adornos C++) normalmente es
exactamente el mismo que el producido por un
compilador C++. Eso tranquiliza a aquellos programadores C que
dependan de los detalles de tamaño y distribución de su código, y
que por alguna razón accedan directamente a los bytes de la
estructura en lugar de usar identificadores (confiar en un tamaño
y distribución particular para una estructura no es portable).
El tamaño de una struct
es la combinación de los
tamaños de todos sus miembros. A veces cuando el compilador crea
una struct
, añade bytes extra para hacer que los
límites encajen limpiamente - eso puede incrementar la
eficiencia de la ejecución. En el Capítulo
14, verá cómo en algunos casos se añaden punteros
«secretos» a la estructura, pero no tiene que
preocuparse de eso ahora.
Puede determinar el tamaño de una struct
usando
el operador sizeof
. Aquí tiene un pequeño ejemplo:
//: C04:Sizeof.cpp // Sizes of structs #include "CLib.h" #include "CppLib.h" #include <iostream> using namespace std; struct A { int i[100]; }; struct B { void f(); }; void B::f() {} int main() { cout << "sizeof struct A = " << sizeof(A) << " bytes" << endl; cout << "sizeof struct B = " << sizeof(B) << " bytes" << endl; cout << "sizeof CStash in C = " << sizeof(CStash) << " bytes" << endl; cout << "sizeof Stash in C++ = " << sizeof(Stash) << " bytes" << endl; } ///:~
Listado 4.7. C04/Sizeof.cpp
En mi máquina (los resultados pueden variar) el primer resultado
produce 200 porque cada int
ocupa 2 bytes. La
struct
B
es algo anómalo porque es una
struct
sin atributos. En C, eso es ilegal, pero en C++
necesitamos la posibilidad de crear una struct
cuya
única tarea es ofrecer un ámbito a nombres de funciones, por eso
está permitido. Aún asi, el segundo resultado es un sorprendente
valor distinto de cero. En versiones anteriores del lenguage, el
tamaño era cero, pero aparecia una situación incómoda cuando se
creaban estos objetos: tenían la misma dirección que el objeto
creado antes que él, y eran indistinguibles. Una de las reglas
fundamentales de los objetos es que cada objeto debe tener una
dirección única, así que las estructuras sin atributos siempre
tendrán tamaño mínimo distinto de cero.
Las dos últimas sentencias sizeof
muestran que el
tamaño de la estructura en C++ es el mismo que en la versión en
C. C++ intenta no añadir ninguna sobrecarga innecesaria.