2012-05-09 23 views
7

Ho letto da qualche parte che l'utilizzo di BOOL (typedef int) è migliore rispetto all'utilizzo del tipo standard C++ bool perché la dimensione di BOOL è 4 byte (ovvero un multiplo di 4) e salva operazioni di allineamento di variabili in registri o qualcosa del genere ...C++ BOOL (typedef int) vs bool per prestazioni

C'è qualche verità in questo? Immagino che il compilatore riempia i frame dello stack per mantenere allineamenti multipli di 4 anche se usi bool (1 byte)?

Non sono affatto un esperto sui meccanismi di allineamento, registri, ecc. Quindi mi scuso in anticipo se ho sbagliato completamente. Spero di essere corretto. :)

Cheers!

+6

Se 'bool' è più veloce di 4 byte, il compilatore lo renderà 4 byte. Dipende dallo scenario. Quindi no, 'BOOL' non fornisce un vantaggio in termini di prestazioni. – tenfour

+0

Questo è il tipo di cosa che puoi scoprire solo tramite la creazione di profili, ma vuoi un valore bool che può avere valori diversi da 0,1? Anche i valori negativi? – juanchopanza

+0

Questo non farà alcuna differenza. I valori dei pad del compilatore per garantire che siano allineati correttamente. Usa il tipo che ha più senso. Se si tratta di un valore booleano, rendilo un 'bool', non un' int' (o alcuni 'typedef' di ciò). –

risposta

7

Prima di tutto, sizeof(bool) non è necessariamente 1. È implementation-defined, dando al produttore del compilatore la libertà di scegliere una dimensione adatta alla piattaforma di destinazione.

Inoltre, sizeof(int) non è necessariamente 4.

ci sono più problemi che potrebbero influire sulle prestazioni:

  • allineamento;
  • larghezza di banda di memoria;
  • Capacità della CPU di caricare in modo efficiente valori più stretti della parola macchina.

Cosa - se c'è - la differenza che rende un particolare pezzo di codice può essere stabilita solo profilando quel pezzo di codice.

+0

E il compilatore avrà probabilmente adattato la dimensione di un 'bool' per riflettere questi problemi. –

+0

Generalmente parlando però; Per l'esempio, diciamo che bool è 1 byte e che un int è 4 byte. Supponi di avere una struct {bool x; int y}; La x causa la mancanza di allineamento perché la dimensione non è un multiplo di 4? O il compilatore riempie gli indirizzi in modo che y sia allineato? –

+1

@KarlHansson: il riempimento è specifico dell'implementazione. Le implementazioni a me familiari dovrebbero inserire padding dopo 'x' in modo che' y' sia adeguatamente allineato. – NPE

2

L'unica dimensione garantita si può ottenere in C++ è con char, unsigned char, e signed char2), che sono sempre esattamente un byte e definito per ciascuna piattaforma. 0)1)


0) Sebbene un byte non hai dimensione definita. sizeof(char) è sempre 1 byte, ma potrebbe essere di 40 bit binari infatti

1) Sì, c'è uint32_t e gli amici, ma no, la loro definizione è facoltativo per effettive implementazioni C++. usarli, ma è possibile ottenere errori di compilazione di tempo se non sono disponibili (errori di compilazione di tempo sono sempre bene)

2) char, unsigned char, e signed char sono tipi distinti e non è definito se char è signed o non. Tienilo a mente quando sovraccarichi funzioni e scrivi modelli.

0

Ci sono tre pratiche di performance-driven comunemente accettati in materia di booleani:

  1. In se-dichiarazioni ordine di controllare le espressioni materie e uno ha bisogno di essere attenti a loro.
  2. Se un controllo di un'espressione booleana causa molte errate previsioni di ramo, allora dovrebbe (se possibile) essere sostituito con un hack a piccoli giri.
  3. Poiché booleano è un tipo di dati più piccolo, le variabili booleane devono essere dichiarate per ultime nelle strutture e nelle classi, in modo che il riempimento non aggiunga buchi evidenti nel layout della memoria della struttura.

Non ho mai sentito parlare di alcun guadagno in termini di prestazioni sostituendo un valore booleano con un numero intero (senza segno?).

+0

# 3 non è necessariamente vero. In uno scenario in cui esiste già una lacuna nella struttura (dovuta all'allineamento/riempimento automatico), è possibile "riempire" lo spazio per "libero" posizionando il bool lì. Diciamo che questa struttura ha già una dimensione che è un multiplo perfetto della dimensione della cache-line, quindi aggiungere un bool alla fine della struct (invece di riempire il gap) causerà effettivamente un errore di cache in alcune situazioni quando si prova per accedere a quel membro bool, (mentre altrimenti non ci sarebbe cache-miss). Dovresti giudicare ogni struttura in modo indipendente. –

+0

@PreetKukreti hai ragione, avrei dovuto dire "pratiche comunemente accettate che non richiedono la conoscenza della piattaforma sottostante". Se si conosce la piattaforma su cui deve essere eseguito il SW, allora sì, è possibile conoscere l'allineamento (4 o 8 o ...) e regolare di conseguenza - riempire i fori, allineare alle linee della cache, ecc. Cosa ho suggerito nel la lista era regole generali per trattare i booleani. –