Assumere un'API in cui ogni funzione restituisce un codice di errore che è zero in caso di errore e non zero per i valori di errore.Ottimizzazione della valutazione dei parametri in linea C statico
Let
int foo(...);
int bar(...);
tramite funzioni in questa API. Sia il frammento di codice in cui foo
e bar
devono essere chiamati in ordine e foo e bar dovrebbe sempre essere chiamato, a prescindere dalle precedenti errore ma la prima restituito il codice di errore diverso da zero deve essere propagato, cioè
int foobar(...)
{
int rc = 0, rc_;
/* ... */
rc_ = foo(...); rc = rc ? rc : rc_;
rc_ = bar(...); rc = rc ? rc : rc_;
return rc;
}
Scrivere la rc, rc_ multiplexing è stancante e soggetto a errori (non importa se un operatore ternario, se/else o qualcos'altro viene utilizzato).
Ci sia un errore di moltiplicazione funzione di supporto
static inline
int rc_propagate(int r, int p){ return p ? p : r; }
Questo potrebbe essere utilizzato in foobar
come questo
int foobar(...)
{
int rc = 0;
/* ... */
rc = rc_propagate(foo(...), rc);
rc = rc_propagate(bar(...), rc);
return rc;
}
Fa lo standard C consentono di ottimizzare tirando la valutazione del primo parametro di rc_propagate
, una funzione inline statica, nel ternario in modo che non possa essere eseguita a causa delle regole di valutazione dell'operatore ternario se il secondo parametro p
fosse diverso da zero?
credo che nessuno, ma aspetterò che qualcuno citare la parte pertinente della norma. – immibis
@ 2501: solo che in questo caso non è una funzione esterna, ma statica in linea.I miei dubbi riguardano esclusivamente l'inline statico; in particolare ho appena letto alcune voci del blog degli sviluppatori di LLVM e le possibili ottimizzazioni riguardanti le funzioni di chiamata che sono statiche in linea. – datenwolf
In una nota a margine, perché non scrivi semplicemente: 'rc = rc? rc: foo (...); 'ed evita del tutto il problema? – 2501