4.6. Detalles del objeto

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.