2012-03-06 12 views
5

Dove nello standard C++ parla di aliasing? Ho guardato il ToC e non ho visto la parola "pseudonimo". Ho provato a cercare nell'unica regola di definizione (3.2) e una ricerca di "alias" non ha avuto risultati. Sono in perdita dove potrebbe essere. Sto cercando di memoria aliasingDove lo standard parla di aliasing?

+1

Potresti essere più specifico? Ci sono almeno due cose a cui ci si può riferire con "aliasing": alias di namespace e alias di dati nella memoria tramite structs/unions/array sovrapposti. – dasblinkenlight

+0

@dasblinkenlight: corretto. Alias ​​di dati/memoria –

risposta

10

Aliasing è discusso principalmente in §3.10 [basic.lval]/10:

Se un programma tenta di accedere al valore memorizzato di un oggetto attraverso una glvalue di diverso uno dei seguenti tipi il comportamento è indefinito:

  • tipo dinamico dell'oggetto,
  • una versione cv qualificato di tipo dinamico dell'oggetto,
  • un tipo simile (come definito in 4.4) per il tipo dinamico dell'oggetto,
  • un tipo che è il segno o tipo senza segno corrispondente al tipo dinamico dell'oggetto,
  • un tipo che è la firma o tipo senza segno corrispondente a una versione cv qualificata del tipo dinamico
  • un tipo aggregato o di unione che include uno dei tipi sopra menzionati tra i suoi elementi o membri di dati statici non (incluso, in modo ricorsivo, un elemento o dati non statici membro di un subaggregato o unione contenuta),
  • un tipo che è un tipo di classe base (eventualmente qualificata per il cv) del tipo dinamico dell'oggetto,
  • a char o unsigned char tipo.

52) L'intento di questo elenco è specificare quelle circostanze in cui un oggetto può o non può essere alias.

Così, per esempio,

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

seguenti diciture può anche essere interessante.

§5.17 [expr.ass]/8

Se il valore essere memorizzato in un oggetto è accessibile da un altro oggetto che si sovrappone in alcun modo la memorizzazione del primo oggetto, quindi la sovrapposizione sarà esatto e i due oggetti devono avere lo stesso tipo, altrimenti il ​​comportamento di non è definito. [Nota: questa restrizione si applica alla relazione tra i lati sinistro e destro di l'operazione di assegnazione; non è una dichiarazione su come l'obiettivo del compito può essere aliasato in generale . Vedi 3.10. - nota end]

§17.6.4.9 [res.on.argomenti]/1 Pt 3

Se un argomento funzione si lega ad un parametro di riferimento rvalue, l'applicazione può supporre che questo parametro è un riferimento unico a questo argomento. ... [Il implementazione è gratuito per ottimizzare via aliasing controlli che potrebbero essere necessari se l'argomento fosse un lvalue.]

§26.6.2 [valarray.syn]/2:

Il Le classi di array valarray sono definite prive di determinate forme di aliasing, consentendo quindi l'ottimizzazione delle operazioni su .

e il resto di <valarray> discute anche come la classe deve essere implementata per evitare l'alias dei dati.