what example ejemplo define cppreference c++ c pointers struct object-layout

example - C vs C++ estructura de alineación



typedef struct c ejemplo (3)

Cuando se desarrolló C ++, los desarrolladores descubrieron que los programadores de C confiaban en algunas cosas que los desarrolladores de C ++ no querían garantizar, pero no garantizarlos significaría que una gran cantidad de código C que también era válido era roto cuando se usaba. como código C ++. No deseable.

Es por eso que inventaron las estructuras de "POD": una estructura que no usara ninguna característica de C ++ se comportaría en un programa de C ++ exactamente como lo haría en un programa de C (aparte del hecho de que el comportamiento definido por la implementación podría cambiar, ya que un compilador de C y un compilador de C ++ claramente no es la misma implementación. Por otro lado, el compilador de C ++ probablemente solo copiará la definición de implementación del compilador de C).

Si toma una estructura C simple que también es una estructura C ++ válida (no hay miembros llamados "clase", por ejemplo), y luego agrega "public:" justo después de la llave de apertura, su diseño, orden de miembros, alineación y así todo puede cambiar. A pesar de que todos los miembros de la estructura son públicos de forma predeterminada, nada cambió realmente. Excepto que debido al "público": ya no es un POD.

Me han preguntado en una entrevista reciente sobre la alineación de los campos de estructura de C ++ y he teorizado que C y C ++ siguen la misma estrategia en el empaque de estructura.

Hovewer, era la suposición equivocada. El entrevistador dijo que, en general, C y C ++ son estructuras de embalaje de diferentes maneras y que nunca deberíamos esperar lo contrario. En mi humilde opinión es extraña declaración. No hay un calificador de pack "C" para estructuras en C ++ para usar en archivos de encabezado bilingües de C / C ++.

Por lo tanto, en la práctica, podría significar que no puede crear una estructura en C ++ y pasarla a una biblioteca de C porque, en general, sus campos se alinearán de una manera diferente y tendrán diferentes desplazamientos. Pero, de hecho, la mayoría de los programadores confían seriamente en esta interoperabilidad hasta el punto en que convierten un puntero en una estructura C POD en una referencia al envoltorio C ++ alrededor de esta estructura con algunos métodos auxiliares. ¿Puedes por favor aclarar este asunto?


Esto obviamente era incorrecto (del lado del entrevistador). Es claro ver que el empaquetamiento de estructuras es el mismo para C y C ++ para cualquiera que trabaje con cualquier API bajo nivel que se ocupe de estructuras, por ejemplo, una API de red. Todas esas son funciones C, que aceptan estructuras ''C'', sin embargo, se llaman de forma segura millones de millones de veces al día desde el código C ++.

Deberías tener suerte de tener esta pregunta. Deja en claro que no deberías estar trabajando allí.


Los estándares de lenguaje C y C ++ no requieren requisitos de relleno de estructura y lo dejan como un detalle de implementación del compilador. Una interpretación estricta de esto significaría que no hay garantía de que una estructura sea la misma entre los dos.

Sin embargo, en la práctica, una versión dada de una cadena de herramientas capaz de C y C ++ (como GCC o Clang) puede empaquetar una estructura idéntica de la misma manera, si es necesario. Sin esto, una gran cantidad de código de producción en el mundo simplemente no funcionaría. Sin embargo, esta es una garantía dada por la cadena de herramientas y no por el idioma.

Vale la pena señalar que si declarara una estructura similar al original C, pero añadiera especificadores de acceso ( private , public y protected ), el diseño cambiaría, pero eso es un poco exagerado ya que la estructura ya no es idéntica .