C'è un modo in C++ per dichiarare che una funzione non ha effetti collaterali? Considerare:C++: funzione di ottimizzazione senza effetti collaterali
LOG("message").SetCategory(GetCategory());
Supponiamo ora che la macro LOG nella build di rilascio crea un oggetto che ha NullLogEntry setCategory() definito come una funzione vuota. Quindi, in pratica, l'intera espressione potrebbe (e dovrebbe) essere ottimizzata - a parte il fatto che, in teoria, la chiamata a GetCategory() potrebbe avere alcuni effetti collaterali, quindi suppongo che al compilatore non sia consentito semplicemente buttarlo via.
Un altro esempio potrebbe essere una specializzazione del modello di funzione che ignora alcuni (o tutti) i suoi argomenti, tuttavia il compilatore non può salvare la valutazione di tali argomenti nel sito di chiamata a causa dei possibili effetti collaterali.
Ho ragione? Oppure i compilatori possono comunque ottimizzare tali chiamate? In caso contrario, c'è un modo per suggerire al compilatore che questa funzione non ha effetti collaterali, quindi se il valore di ritorno viene ignorato, l'intera chiamata può essere saltata?
Fintanto che la funzione è abbastanza piccola da essere allineata, le probabilità sono molto buone che tutto il codice è ottimizzato.Ovviamente questo è un dettaglio di implementazione che dovrai verificare tu stesso. –
Fondamentalmente un compilatore non è autorizzato a effettuare alcuna modifica * semantica * durante l'ottimizzazione. Rimozione di una chiamata di funzione è un cambiamento semantico. Dal momento che non puoi dire esplicitamente al compilatore "questa funzione non ha effetti collaterali", non verrà ottimizzata. –
@Cicada: alcuni compilatori C++ definiscono attributi (come 'pure') che consentono di dire al compilatore che la funzione non ha effetti collaterali in modo che, in teoria, possa memorizzare i suoi risultati/ottimizzare le chiamate. –