Perché una dimensione del buffer dell'anello deve essere pari a 2?Perché una dimensione del buffer circolare deve essere pari a 2?
risposta
Deve essere una potenza di 2 per utilizzare l'approccio descritto di seguito. Non è necessario essere diversamente.
Un approccio comune è simile a "if (index> = size) {index = size - index;}" (dimensione di 10, indice 10, indice risultante è 0). Questo è più lento e soggetto a errori relativi al seguente approccio.
Utilizzando una potenza di due ci permette di sfruttare la seguente:
size = 32
bin(size) => '00100000'
mask = size - 1;
bin(mask) => '00011111'
Applicando questa maschera con un bit per bit e, possiamo isolare solo i bit che compongono i numeri nell'intervallo 0 - 31 come l'indice cresce:
index = 4
bin(4 & mask) => '00000100' (4)
# index 32 wraps. note here that we do no bounds checking,
# no manipulation of the index is necessary. we can simply
# and safely use the result.
index = 32
bin(index & mask) => '00000000' (0)
index = 33
bin(index & mask) => '00000001' (1)
index = 64
bin(index & mask) => '00000000' (0)
index = 65
bin(index & mask) => '00000001' (1)
Questo approccio non richiede il confronto, senza rami, ed è sicuro (con conseguente indice di sempre entro certi limiti). Ha il vantaggio di non cedere informazioni; mentre l'indice 65 si rivolge all'elemento 1, conservo ancora l'informazione che l'indice è logicamente 65 (il che si rivela abbastanza utile).
Vorrei anche aggiungere che questo è altrettanto efficace quando l'indice cresce fino a 3.456.237 (indirizzo 13 nel buffer), come quando si tratta di 3.
So di essere in ritardo alla festa, mi Non sono nemmeno sicuro di come ho trovato questa domanda :-) Spero che questo aiuti.
- 1. Implementazione sicura del buffer circolare
- 2. buffer circolare efficiente?
- 3. miglioramento dell'efficienza del buffer circolare C
- 4. Dimensione ottimale del buffer Android
- 5. Quali sono gli usi del buffer circolare?
- 6. Perché constexpr deve essere statico?
- 7. Perché il codice deve essere allineato ai limiti di indirizzo pari su x86?
- 8. android.database.CursorIndexOutOfBoundsException: indice 0 richiesto, con una dimensione pari a 0
- 9. Stampa formattata su buffer circolare
- 10. Come avvolgere in modo efficiente l'indice di un buffer circolare a dimensione fissa
- 11. Perché COBOL deve essere rientrato?
- 12. Perché ({} + {}). Lunghezza pari a 30?
- 13. Perché deve essere fornita una dimensione di enumerazione quando viene dichiarata inoltrata?
- 14. buffer circolare di collezioni scala
- 15. Dimensione del buffer ottimale per il file buffer?
- 16. Impostazione della dimensione del buffer più piccola per sys.stdin?
- 17. Perché un'interfaccia deve essere dichiarata di nuovo?
- 18. C'è una dimensione del buffer collegata allo stdout?
- 19. Perché l'I/O di testo deve essere memorizzato nel buffer in python 3?
- 20. pugnale 2 dipendenza circolare
- 21. Come ottenere l'output completo previsto quando la dimensione del buffer interno di dimensione expect_out (buffer) supera?
- 22. boost :: asio :: buffer: recupero della dimensione del buffer e prevenzione dell'overflow del buffer?
- 23. Perché un metodo ClassInitialize deve essere statico?
- 24. Guardando per l'attuazione buffer circolare a destra in C
- 25. Perché l'ordine del middleware Ring deve essere invertito?
- 26. Perché Intent servizio deve essere esplicita Intent
- 27. Driver di caratteri con buffer circolare
- 28. Incorporare Python su Windows: perché deve essere una DLL?
- 29. Perché zumero_sync deve essere chiamato più volte?
- 30. L'argomento 2 passato a Aws \ AwsClient :: getCommand() deve essere del tipo array, stringa fornita
Cosa ti rende così sicuro che deve essere una potenza di due? –