2009-04-16 19 views

risposta

17

C'è una pagina che descrive aliasing molto accuratamente here.

Ci sono anche alcuni argomenti SO here e here.

Per riepilogare, il compilatore non può assumere il valore dei dati quando due puntatori di tipi diversi accedono allo stesso percorso (vale a dire che deve leggere il valore ogni volta e quindi non può effettuare ottimizzazioni).

Ciò si verifica solo quando non viene applicato il rigido aliasing. Strict opzioni aliasing:

  • gcc: -fstrict-aliasing [Default] e -fno-strict-aliasing
  • msvc: aliasing Strict è disattivata per impostazione predefinita. (Se qualcuno sa come accenderlo, si prega di dirlo.)

Esempio

Copia-incollare questo codice in main.c:

void f(unsigned u) 
{ 
    unsigned short* const bad = (unsigned short*)&u; 
} 

int main(void) 
{ 
    f(5); 

    return 0; 
} 

Poi compila il codice con queste opzioni:

main.c gcc -Wall -O2

e si otterrà:

main.c: 3: avvertimento: dereferenziazione tipo punned puntatore si romperà rigoroso-aliasing regole

aliasing Disabilita con:

gcc main.c -fno-severe-alias ing -Wall -O2

E l'avviso scompare. (Oppure basta estrarre -Wall ma ... non compilare senza di esso)

Prova come potrei non riuscire MSVC a darmi un avvertimento.

+0

+1, ma si prega di chiarire che il compilatore non può fare questa ipotesi quando l'aliasing rigoroso è * non * osservato. –

+1

Perfetto! :) Sfortunato che MSVC++ non sembra avere un'opzione per l'aliasing rigoroso. Tuttavia ha __restrict e __declspec (limitt), che possono essere usati in singoli casi. –

+0

Sembra un refuso "-fno-strict-aliasing [predefinito] e -fno-strict-aliasing" Suppongo che l'impostazione predefinita sia in realtà -fstrict-aliasing (almeno nel GCC moderno) piuttosto che -fno-strict- aliasing, ma in ogni caso una delle due opzioni GCC elencate dovrebbe essere -fstrict-aliasing, e al momento entrambi dicono -fno-strict-aliasing. – tialaramex

Problemi correlati