◐ Shell
clean mode source ↗

offsetof - cppreference.com

De cppreference.com

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.

Excepciones

offsetof no lanza excepciones; la expresión noexcept(offsetof(tipo, miembro)) siempre se evalúa a true.

Notas

offsetof no puede implementarse en C++ estándar y requiere soporte del compilador: GCC, LLVM

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

Véase también