offsetof
Definido en el archivo de encabezado <cstddef> | ||
#define offsetof(tipo, miembro) /*definido por la implementación*/ | ||
La macro offsetof se expande a una expresión constante entera de tipo std::size_t, cuyo valor es el desplazamiento, en bytes, desde el inicio del objeto de un tipo especificado a su miembro especificado, incluyendo relleno, si es que lo hay.
Si tipo
no es un tipo con diseño estándar, el comportamiento está indefinido(hasta C++17)el uso de la macro offsetof
se soporta condicionalmente(desde C++17).
Si miembro
es un miembro estático o una función miembro, el comportamiento está indefinido.
El desplazamiento del primer miembro de un tipo con diseño estándar siempre es cero (la optimización de base vacía es obligatoria).
La expresión offsetof(tipo, miembro)
nunca es dependiente del tipo y es dependiente del valor si y solo si tipo es dependiente.
Contenido |
[editar]Excepciones
offsetof
no lanza excepciones; la expresión noexcept(offsetof(tipo, miembro)) siempre se evalúa a true.
[editar]Notas
offsetof
no puede implementarse en C++ estándar y requiere soporte del compilador: GCC, LLVM
[editar]Ejemplo
#include <iostream>#include <cstddef>struct S {char c;double d;};int main(){std::cout<<"el primer elemento se encuentra en el desplazamiento "<< offsetof(S, c)<<'\n'<<"el double se encuentra en el desplazamiento "<< offsetof(S, d)<<'\n';}
Posible salida:
el primer elemento se encuentra en el desplazamiento 0 el double se encuentra en el desplazamiento 8
[editar]Véase también
Tipo entero sin signo devuelto por el operador sizeof. (typedef) | |
(C++11) | Comprueba si un tipo es un tipo de diseño estándar. (plantilla de clase) |
Documentación de C para offsetof |