Ho trovato un trucco da AGGREGATE Magic per valori massimi di elaborazione veloce. L'unico problema che questo è per i numeri interi, e tuttavia ho provato alcune cose, non ho idea di come fare una versione per interi senza segno.max senza diramazione per interi senza segno
inline int32_t max(int32_t a, int32_t b)
{
return a - ((a-b) & (a-b)>>31);
}
Qualche consiglio?
EDIT
non utilizzare questo, perché, come altri hanno dichiarato che produce un comportamento indefinito. Per qualsiasi architettura moderna il compilatore sarà in grado di emettere un'istruzione di movimento condizionale senza ramo da return (a > b) ? a : b
, che sarà più veloce della funzione in questione.
Aspetta, sei proprio sicuro che questo è più veloce di 'tornare a> b? a: b'? –
Questa funzione è praticamente inutile. Usa 'std :: max'. –
Sì, sulle moderne CPU con pipeline, i rami sono lenti. Ho misurato, questa versione tanto veloce quanto la versione SSE, se non più veloce. – plasmacel