Sabemos que los elementos de una estructura se almacenarán en el orden secuencial de su declaración. ¿Cómo extraer el desplazamiento de un elemento en una estructura? Podemos hacer uso de offsetof macro. Por lo general, llamamos tipos de estructura y unión (o clases con constructores triviales ) como tipos de datos simples (POD), que se utilizarán para agregar otros tipos de datos . La siguiente macro no estándar se puede usar para obtener el desplazamiento de un elemento en bytes desde la dirección base de la variable de estructura.
#define OFFSETOF(TYPE, ELEMENT) ((size_t)&(((TYPE *)0)->ELEMENT))
Zero se convierte en tipo de estructura y se accede a la dirección del elemento requerido, que se convierte en size_t . Según el estándar, size_t es de tipo int sin firmar . La expresión general da como resultado el número de bytes después de los cuales el ELEMENTO se coloca en la estructura. Por ejemplo, el siguiente código devuelve 16 bytes (el relleno se considera en una máquina de 32 bits) como desplazamiento de la variable de carácter c en la estructura Pod.
C++
#include <iostream> using namespace std; #define OFFSETOF(TYPE, ELEMENT) ((size_t)&(((TYPE *)0)->ELEMENT)) typedef struct PodTag { int i; double d; char c; } PodType; int main() { cout << OFFSETOF(PodType, c); return 0; } // This code is contributed by sarajadhav12052009
C
#include <stdio.h> #define OFFSETOF(TYPE, ELEMENT) ((size_t)&(((TYPE *)0)->ELEMENT)) typedef struct PodTag { int i; double d; char c; } PodType; int main() { printf("%lu", OFFSETOF(PodType, c)); getchar(); return 0; }
En el código anterior, la siguiente expresión devolverá el desplazamiento del elemento c en la estructura PodType .
OFFSETOF(PodType, c);
Después de la etapa de preprocesamiento, la macro anterior se expande a
c
((size_t)&(((PodType *)0)->c))
Dado que estamos considerando 0 como dirección de la variable de estructura, c se colocará después de 16 bytes de su dirección base, es decir, 0x00 + 0x10. Aplicar & en el elemento de estructura (en este caso es c) devuelve la dirección del elemento que es 0x10. Convertir la dirección a int sin firmar (size_t) da como resultado la cantidad de bytes que el elemento se coloca en la estructura. Nota: Podemos considerar que el operador de dirección & es redundante. Sin el operador de dirección en la macro, el código elimina la referencia del elemento de estructura colocado en la dirección NULL. Causa una excepción de violación de acceso (falla de segmentación) en tiempo de ejecución. Tenga en cuenta que hay otras formas de implementar la macro offsetof de acuerdo con el comportamiento del compilador. El objetivo final es extraer el desplazamiento del elemento.Veremos el uso práctico de la macro offsetof en las listas de Me gusta para conectar objetos similares (por ejemplo, un grupo de subprocesos) en otro artículo. Artículo recopilado por Venki . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente. Referencias: 1. Código del kernel de Linux . 2. http://msdn.microsoft.com/en-us/library/dz4y9b9a.aspx 3. Documentación del compilador GNU C/C++
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