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?
risposta
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
ounsigned 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.
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
@dasblinkenlight: corretto. Alias di dati/memoria –