2012-03-06 14 views
5

¿En qué parte del estándar C++ habla de aliasing? Miré el ToC y no vi ninguna mención de la palabra 'alias'. Traté de buscar en la regla de una definición (3.2) y una búsqueda de 'alias' no tuvo resultados allí. Estoy perdido donde puede estar. Busco memoria aliasing¿De dónde habla la norma sobre aliasing?

+1

¿Podría ser más específico? Hay al menos dos cosas a las que se puede hacer referencia mediante "aliasing": aliasing de espacio de nombres y aliasing de datos en la memoria a través de structs/unions/overlapping arrays. – dasblinkenlight

+0

@dasblinkenlight: Reparado. Aliasing de datos/memoria –

Respuesta

10

Aliasing se discute principalmente en §3.10 [basic.lval]/10:

Si un programa intenta acceder al valor almacenado de un objeto a través de un glvalue de que no sea uno de los siguientes tipos no está definido el comportamiento:

  • el tipo dinámico del objeto,
  • una versión cv calificado del tipo dinámico del objeto,
  • un tipo similar (como se define en 4.4) para el tipo dinámico del objeto,
  • un tipo que es el firmado o tipo sin signo correspondiente al tipo dinámico del objeto,
  • un tipo que es el firmado o tipo sin firmar correspondiente a una versión cv-calificada del tipo dinámico del objeto,
  • un agregado o tipo de unión que incluye uno de los tipos antes mencionados entre sus elementos o miembros de datos estáticos no (incluido, recursivamente, un elemento o elemento de datos no estáticos de un subaggregado o unión contenida),
  • un tipo que es un tipo de clase base (posiblemente cv calificado) del tipo dinámico del objeto,
  • a char o unsigned char tipo.

52) La intención de esta lista es especificar aquellas circunstancias en las que un objeto puede o no puede tener un alias.

Así, por ejemplo,

int x = 1; 
*(char*)(&x);  // (implementation-)defined 
*(unsigned*)(&x); // (implementation-)defined 
*(float*)(&x); // undefined 

las siguientes menciones también puede ser interesante.

§5.17 [expr.ass]/8

Si se accede al valor que se almacena en un objeto de otro objeto que se superpone en forma alguna el almacenamiento de el primer objeto, entonces el solapamiento será exacta y los dos objetos deben tener el mismo tipo, de lo contrario, el comportamiento no está definido. [Nota: Esta restricción se aplica a la relación entre los lados izquierdo y derecho de la operación de asignación; no es una declaración sobre cómo se puede alias el objetivo de la asignación en en general. Ver 3.10. - finales nota]

§17.6.4.9 [res.on.argumentos]/1 pt 3:

Si un argumento de la función se une a un parámetro de referencia rvalue, la aplicación puede suponer que este parámetro es una referencia única a este argumento. ... [La aplicación es gratuito para optimizar distancia aliasing controles que podrían ser necesarias si el argumento era un valor-i.]

§26.6.2 [valarray.syn]/2:

El valarray las clases de matriz se definen como libres de ciertas formas de aliasing, lo que permite optimizar las operaciones en .

y el resto de <valarray> también explica cómo se debe implementar la clase para evitar el alias de datos.

Cuestiones relacionadas