Qual è il modo corretto per abilitare gli avvisi di alias rigidi in g ++? VC++ 10 implementa tali regole?Abilitazione di avvisi di alias rigidi in g ++
risposta
Utilizzare -fstrict-aliasing
per g++
. Io uso anche -Wstrict-aliasing=2
per vedere gli avvertimenti relativi a possibili violazioni delle rigide regole di aliasing.
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.
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.
Le regole sono sempre "abilitate". Solo l'avvertimento che ti dice quando li stai violando è facoltativo. –