2011-12-18 25 views

risposta

4

Utilizzare -fstrict-aliasing per g++. Io uso anche -Wstrict-aliasing=2 per vedere gli avvertimenti relativi a possibili violazioni delle rigide regole di aliasing.

3

Sono attivati ​​automaticamente da -O2 perché è necessario utilizzarli per eseguire alcune ottimizzazioni. Assolutamente combinalo con l'avviso (-Wall fa il trucco) per assicurarti di non creare codice potenzialmente buggato. Altrimenti puoi usare -fstrict-aliasing come visto in un'altra risposta per abilitarli.

Non sono sicuro di VC++ 10.

1

VC++ 10 attiva la regola di aliasing rigorosa con/O1 e sopra. Uso il programma di test (con valore di conteggio 6) nel capitolo "VANTAGGI PER LA REGOLARE REGOLA DI ALIENTAMENTO" di here. E ottenere il seguente codice asm. Puoi vedere il carico di b solo una volta.

00A910AE movzx  edx,word ptr [edx+2] //Load of b 
00A910B2 xor   eax,eax 
00A910B4 xor   ecx,ecx 
00A910B6 add   dword ptr [esp+eax*4+34h],edx //Loop start 
00A910BA add   eax,1 
00A910BD adc   ecx,edi 
00A910BF jne   main+76h (0A910C6h) 
00A910C1 cmp   eax,6 
00A910C4 jb   main+66h (0A910B6h) //Loop end 

ma sembra che non ci sia un modo per abilitare l'avviso per rompere questa regola.