C LanguageAliasing y tipo efectivo.


Observaciones

Las violaciones de las reglas de creación de alias y de violar el tipo efectivo de un objeto son dos cosas diferentes y no deben confundirse.

  • El aliasing es la propiedad de dos punteros a y b que se refieren al mismo objeto, es decir, a == b .

  • C utiliza el tipo efectivo de un objeto de datos para determinar qué operaciones se pueden realizar en ese objeto. En particular, el tipo efectivo se utiliza para determinar si dos punteros pueden alias entre sí.

El aliasing puede ser un problema para la optimización, porque cambiar el objeto a través de un puntero, a ejemplo, puede cambiar el objeto que es visible a través del otro puntero, b . Si su compilador de C tuviera que asumir que los punteros siempre se podrían aliar entre sí, independientemente de su tipo y procedencia, se perderían muchas oportunidades de optimización y muchos programas se ejecutarían más lentamente.

Las reglas estrictas de alias de C se refieren a los casos en el compilador que puede asumir qué objetos se hacen (o no) alias entre sí. Hay dos reglas básicas que siempre debe tener en cuenta para los punteros de datos.

A menos que se indique lo contrario, dos punteros con el mismo tipo de base pueden ser alias.

Dos punteros con un tipo de base diferente no pueden ser alias, a menos que al menos uno de los dos tipos sea un tipo de carácter.

Aquí , tipo base significa que dejamos de lado las calificaciones de tipo como const , por ejemplo, si a es double* y b es const double* , el compilador generalmente debe asumir que un cambio de *a puede cambiar *b .

Violar la segunda regla puede tener resultados catastróficos. En este caso, violar la regla de alias estricta significa que presenta dos punteros a y b de diferente tipo al compilador que en realidad apuntan al mismo objeto. Entonces, el compilador siempre puede suponer que los dos apuntan a objetos diferentes, y no actualizará su idea de *b si cambia el objeto a través de *a .

Si lo haces, el comportamiento de tu programa se vuelve indefinido. Por lo tanto, C pone restricciones muy severas en las conversiones de punteros para ayudarlo a evitar que esa situación ocurra accidentalmente.

A menos que el tipo de origen o destino sea void , todas las conversiones de punteros entre punteros con un tipo de base diferente deben ser explícitas .

O en otras palabras, necesitan un molde, a menos que haga una conversión que sólo añade un calificativo como const al tipo de destino.

Evitar las conversiones de punteros en general y las conversiones en particular lo protege de los problemas de aliasing. A menos que realmente los necesite, y estos casos son muy especiales, debe evitarlos como pueda.

Aliasing y tipo efectivo. Ejemplos relacionados