En el estándar, la igualdad se discute en §6.5.9 “Operadores de igualdad”, &
se discute en §6.5.3.2 “operadores de dirección y de indirección”, y const
se discute en §6.7.3 “Tipo calificadores”. El pasaje relevante sobre la igualdad del puntero es §6.5.9.6:
dos punteros comparan iguales si y sólo si ambos son punteros nulos, ambos son punteros a la mismo objeto (incluyendo un puntero a un objeto y un subobjeto en su comienzo) o función, [o punteros pasado el final de una matriz]
la única definición de &
es que “el &
operador unario produce la dirección de su operando. [...] El resultado es un puntero al objeto o función designado por su operando. "(§6.5.3.2.3). Lamentablemente, no existe una definición formal de la palabra "dirección"; pero los objetos distintos (para la igualdad definida por ==
) tienen direcciones distintas, porque las direcciones son punteros que son distintos por la definición de igualdad anterior.
En cuanto al significado de const
, el §6.7.3 no indica que const
tenga alguna relación con lo que crea un objeto (que es "una región de almacenamiento de datos en el entorno de ejecución, cuyos contenidos pueden representar valores "Por §3.14). Una nota al pie de página indica además que "la implementación no necesita asignar almacenamiento para tal objeto si su dirección nunca se usa". Aunque esto no es normativo, es una fuerte indicación de que si se usa la dirección, entonces el almacenamiento debe asignarse para cada objeto.
Tenga en cuenta que si los objetos son const volatile
, entonces es bastante claro (tan claro como volatile
puede ser nunca) que no pueden tener la misma dirección, porque const volatile
objetos son mutables por la implementación. (§6.7.3.10 tiene un ejemplo de uso de const volatile
.)
Incluso en el caso no volátil, const
sólo indica que esta parte del programa no está autorizado a modificar el objeto, no es que el objeto es lectura solo en general. Para combinar el almacenamiento de un objeto const
con otra cosa, el implementador audaz debería garantizar que nada puede modificar el objeto. Esto es bastante difícil para un objeto con enlace externo en una implementación con compilación separada (pero, por supuesto, nos estamos alejando del estándar y entramos en el territorio de la práctica no va a suceder).
Si esto es acerca de cómo escribir un programa en C, entonces se puede aumentar sus posibilidades dando a los objetos de valores diferentes:
const int x = __LINE__;
const int y = __LINE__;
Si esto se trata de un modelo teórico de C, me gustaría ir para hacer el objetos distintos. Tendrás que justificar esta elección resumiendo las respuestas aquí en un párrafo en (la versión extendida de) tu artículo.
Por otro lado, si se trata de escribir un compilador de optimización, dudo que perjudique a muchos programas del mundo real fusionar constantes. Me gustaría fusionarme en un compilador incrustado, donde los usuarios están acostumbrados a jugar a lo seguro con casos extremos y donde la memoria guardada podría ser no despreciable. Iría contra la fusión en una plataforma alojada donde cualquier ganancia sería insignificante.
(Referencias de N1256 también conocido como C99 + TC3. Yo no creo que la versión marca una diferencia.)
Tenga en cuenta que sólo se emitirá gcc '' x' y y' si se pueden tomar sus direcciones, y en ese caso, los emite en diferentes direcciones. – ninjalj
Vea también: [Análisis profundo de Const Calificador en C] (http://stackoverflow.com/questions/4275504/deep-analysis-of-const-qualifier-in-c) –