Operador sizeof
Consulta el tamaño de un objeto o tipo.
Se usa cuando debe conocerse el tamaño real del objeto.
Contenido |
[editar] Sintaxis
sizeof( tipo )
|
(1) | ||||||||
sizeof expresión
|
(2) | ||||||||
Ambas versiones devuelven una constante de tipo std::size_t.
[editar] Explicación
[editar] Notas
Dependiendo de la arquitectura del ordenador, un byte puede consistir en 8 o más bits, el número exacto está registrado en CHAR_BIT.
Las siguientes expresiones sizeof
siempre se evalúan a 1:
- sizeof(char)
- sizeof(signed char)
- sizeof(unsigned char)
|
(desde C++17) |
|
(desde C++20) |
No se puede usar sizeof
con tipos función, tipos incompletos, o campos de bits que son gl-valores.
Cuando se aplica a un tipo referencia, el resultado es el tamaño del tipo referenciado.
Cuando se aplica a un tipo clase, el resultado es el número de bytes ocupado por un objeto completo de esa clase, incluyendo cualquier relleno requerido para poner dicho objeto en un array. El número de bytes ocupado por un subobjeto potencialmente traslapante puede ser menor que el tamaño de ese objeto.
Cuando se aplica a un tipo clase vacío, siempre devuelve 1.
Cuando se aplica a una expresión, sizeof
no evalúa la expresión, e incluso si la expresión designa un objeto polimórfico, el resultado es el tamaño del tipo estático de la expresión. No se realizan conversiones de l-valor a r-valor, array a puntero, o función a puntero. La materialización temporal, sin embargo, (formalmente) se realiza para argumentos pr-valor: el programa está mal formado si el argumento no es destruible. (desde C++17)
[editar] Palabra clave
[editar] Ejemplo
La salida del ejemplo corresponde con un sistema con punteros de 64-bits e int de 32-bits.
#include <iostream> struct Empty {}; struct Base { int a; }; struct Derived : Base { int b; }; struct Bit { unsigned bit: 1; }; int main() { Empty e; Derived d; Base& b = d; [[maybe_unused]] Bit bit; int a[10]; std::cout << "1) para clase vacia: " << sizeof e << "\n" << "2) para puntero: " << sizeof &e << "\n" // << "3) para funcion: " << sizeof(void()) << "\n" // ERROR // << "4) para tipo incompleto: " << sizeof(int[]) << "\n" // ERROR // << "5) para campo de bit: " << sizeof bit.bit << "\n" // ERROR << "6) para clase Bit: " << sizeof(Bit) << '\n' << "7) para array de 10 int: " << sizeof(int[10]) << "\n" << "8) para array de 10 int (2): " << sizeof a << "\n" << "9) longitud de array de 10 int: " << ((sizeof a) / (sizeof *a)) << "\n" << "A) longitud de array de 10 int (2): " << ((sizeof a) / (sizeof a[0])) << "\n" << "B) para Derived: " << sizeof d << "\n" << "C) para Derived a traves de Base: " << sizeof b << "\n"; }
Posible salida:
1) para clase vacia: 1 2) para puntero: 8 6) para clase Bit: 4 7) para array de 10 int: 40 8) para array de 10 int (2): 40 9) longitud de array de 10 int: 10 A) longitud de array de 10 int (2): 10 B) para Derived: 8 C) para Derived a traves de Base: 4
[editar] Véase también
operador alignof (C++11)
|
Consulta los requerimientos de alineación de un tipo (desde C++11) |
sizeof... operator(C++11)
|
Consulta el número de elementos en un paquete de parámetros. |
Documentación de C para sizeof
|