Cuando se introdujo la estructura en C, no existía el concepto de Objetos en ese momento. Entonces, de acuerdo con el estándar C, se decidió mantener el tamaño de la estructura vacía en cero.
En C++, el tamaño de una estructura/clase vacía es de un byte para llamar a una función, al menos la estructura/clase vacía debe tener algún tamaño ( se requiere un mínimo de 1 byte ), es decir, un byte para que sean distinguibles.
Ahora, para comprender el tamaño de una clase vacía, ¡aprendamos primero qué es una clase vacía!
Clase vacía: es una clase que no contiene ningún miembro de datos (por ejemplo, int a, float b, char c y string d, etc.). Sin embargo, una clase vacía puede contener funciones miembro.
¿Por qué en realidad una clase vacía en C++ toma un byte?
Simplemente, una clase sin un objeto no requiere que se le asigne espacio. El espacio se asigna cuando se crea una instancia de la clase, por lo que el compilador asigna 1 byte a un objeto de una clase vacía para su identificación de dirección única.
Si una clase tiene varios objetos, pueden tener diferentes ubicaciones de memoria únicas. Supongamos que si una clase no tiene ningún tamaño, ¿qué se almacenaría en la ubicación de la memoria? Esa es la razón por la que cuando creamos un objeto de una clase vacía en un programa C++, necesita algo de memoria para almacenarse, y la cantidad mínima de memoria que se puede reservar es 1 byte. Por lo tanto, si creamos varios objetos de una clase vacía, cada objeto tendrá una dirección única.
El siguiente código muestra el tamaño de la clase vacía:
CPP
// C++ program without any compilation // error to demonstrate the size of // an Empty Class #include <iostream> using namespace std; // Creating an Empty Class class Empty_class { }; // Driver Code int main() { cout << "Size of Empty Class is = " << sizeof(Empty_class); return 0; }
Size of Empty Class is = 1
El tamaño de una clase vacía no es cero. Generalmente es de 1 byte. Es distinto de cero para garantizar que los dos objetos diferentes tengan direcciones diferentes. Vea el siguiente ejemplo.
CPP
// C++ program without any compilation // error to demonstrate that the size // of the two different objects of an // Empty Class will have different // addresses #include <iostream> using namespace std; // Creating an Empty class class Empty { }; // Driver Code int main() { Empty a, b; if (&a == &b) cout << "Impossible " << endl; else cout << "Fine " << endl; return 0; }
Fine
Por la misma razón (objetos diferentes deben tener direcciones diferentes), ‘nuevo’ siempre devuelve punteros a objetos distintos. Vea el siguiente ejemplo.
C++
// C++ program without any // compilation error to demonstrate // that "new" always returns pointers // to distinct objects #include <iostream> using namespace std; // Creating an Empty Class class Empty { }; // Driver Code int main() { Empty* p1 = new Empty; Empty* p2 = new Empty; if (p1 == p2) cout << "Impossible " << endl; else cout << "Fine " << endl; return 0; }
Fine
Ahora, adivina la salida del siguiente programa:
CPP
// CPP Program as an exercise #include <iostream> using namespace std; // Creating an Empty Class class Empty { }; // Creating a Derived Class class Derived : Empty { int a; }; // Driver Code int main() { cout << sizeof(Derived); return 0; }
4
Nota: la salida no es mayor que 4. Hay una regla interesante que dice que una clase base vacía no necesita estar representada por un byte separado. Por lo tanto, los compiladores son libres de realizar optimizaciones en caso de clases base vacías.
Como ejercicio, pruebe el siguiente programa en su compilador.
CPP
// CPP Program as an exercise #include <iostream> using namespace std; class Empty { }; class Derived1 : public Empty { }; class Derived2 : virtual public Empty { }; class Derived3 : public Empty { char c; }; class Derived4 : virtual public Empty { char c; }; class Dummy { char c; }; int main() { cout << "sizeof(Empty) " << sizeof(Empty) << endl; cout << "sizeof(Derived1) " << sizeof(Derived1) << endl; cout << "sizeof(Derived2) " << sizeof(Derived2) << endl; cout << "sizeof(Derived3) " << sizeof(Derived3) << endl; cout << "sizeof(Derived4) " << sizeof(Derived4) << endl; cout << "sizeof(Dummy) " << sizeof(Dummy) << endl; return 0; }
sizeof(Empty) 1 sizeof(Derived1) 1 sizeof(Derived2) 8 sizeof(Derived3) 1 sizeof(Derived4) 16 sizeof(Dummy) 1
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA