In C, quali sono esattamente i vantaggi prestazionali derivanti dall'osservazione rigorosa dell'aliasing?Vantaggi delle prestazioni del rigoroso aliasing
risposta
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.
- 1. Aliasing rigoroso in Rust?
- 2. Visual C++ supporta "aliasing rigoroso"?
- 3. C++: aliasing rigoroso contro abuso sindacale
- 4. Aliasing rigoroso e array in stile C std :: array vs
- 5. Vantaggi delle prestazioni dei connettori nativi di Apache Tomcat
- 6. I vantaggi delle costanti
- 7. Impossibile riprodurre: C++ Vantaggi delle prestazioni vettoriali rispetto a C# Prestazioni degli elenchi
- 8. Costo delle prestazioni del proxy dinamico Java
- 9. Test delle prestazioni del codice PHP
- 10. Test delle prestazioni del browser tramite selenio
- 11. Miglioramento delle prestazioni del kernel aumentando l'occupazione?
- 12. Vantaggi/Svantaggi delle guerre esplose
- 13. Sovraccarico delle prestazioni delle librerie javascript
- 14. vantaggi del design senza tablature delle pagine web?
- 15. SOLR ottimizzazione delle prestazioni
- 16. Vantaggi del sovraccarico del costruttore
- 17. Prestazioni delle funzioni MySql Xml?
- 18. Miglioramento delle prestazioni SQLite
- 19. Strano comportamento delle prestazioni
- 20. SignalR Contatore delle prestazioni non visualizzato nel monitor delle prestazioni
- 21. Quali sono i vantaggi delle coroutine?
- 22. Redis Ottimizzazione delle prestazioni
- 23. Tracciamento delle prestazioni ORM
- 24. Rigida regola di aliasing del C++ - L'esonero di aliasing 'char' è una strada a doppio senso?
- 25. Ottimizzazione delle prestazioni delle prese Java
- 26. Vantaggi del TDD nell'apprendimento automatico
- 27. Vantaggi dell'utilizzo dell'esecuzione del processo JNA
- 28. L'espressione regolare Java offre vantaggi in termini di prestazioni?
- 29. Conseguenza delle prestazioni delle funzioni membro volatile
- 30. Quali sono i vantaggi delle diverse endianness?
+1, ma si prega di chiarire che il compilatore non può fare questa ipotesi quando l'aliasing rigoroso è * non * osservato. –
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. –
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