Wenn es um Array-Größen geht, vermute ich, dass es zwei Gründe gibt, warum Potenzen von zwei bevorzugt werden. Einer - wie mehrere Antworten hier zeigen - ist, dass Programmierer, die nicht wissen, was "unter der Haube" vor sich geht, den Eindruck haben, dass es effizienter ist, eine Zweierpotenz zu verwenden. Das andere ist (hauptsächlich in historischer Zeit) mit zyklischen Puffern zu tun.
Zyklische Puffer, die Zweierpotenzen sind, können einfacher und schneller gehandhabt werden, indem Masken die Lese- und Schreibindizes (oder Zeiger) verwenden, anstatt die normalerweise langsamere Modulooperation oder Bedingungen zu verwenden, die Verzweigungen erfordern. Dies war bei älteren Maschinen entscheidend, kann aber immer noch wichtig sein für die Übertragung großer Datenmengen - z. Verarbeitung von Grafik
beispielsweise in C, die die Anzahl der verfügbaren Bytes in einem zyklischen Puffer gelesen werden, kann durchgeführt werden, erhalten:
pending = (SIZE + wr - rd) & (SIZE - 1);
Wenn nicht Zweierpotenz verwendet dann würde die äquivalent sein:
pending = (SIZE + wr - rd) % (SIZE - 1);
Bei Maschinen, die nicht über eine Abteilung/Modul Anweisung, dass wenig „%“ implementieren könnte mehrere hundert Zyklen dauern, so dass Sie so etwas wie brauchen würden:
if (wr >= rd)
pending = wr - rd;
else
pending = (SIZE + wr) - rd;
Die den Code verstopft und Verzweigungen verursacht, die die Befehlspipeline blockieren können.
in den Puffer schreiben, die etwas war wie
buf[wr++] = x;
if (wr == SIZE)
rd = 0;
wird die (in der Regel) effizienter:
buf[wr++] = x;
wr &= SIZE-1;
Natürlich, wenn Sie eine nicht signierte 8-Bit-Variable Index ein 256 Eintrag Array verwendet dann musstest du nicht einmal die Maskierung machen.
Ich glaube nicht, dass diese Frage beantwortet werden kann, ohne zu wissen, wofür die Konstante verwendet wird. Der Zweck der Konstanten bestimmt, welche Werte die Konstante annehmen kann. –
Ein Beispiel könnte die Größe eines Arrays von Ints sein. –
Ich glaube, du denkst, wir verwenden mehr als 2-mal mehr als sie tatsächlich benutzt werden. Leute werden ein Array von 100 Ints genauso verwenden wie ein Array von 256 Bitmasking ist der Hauptgrund für Potenzen von 2 und trifft nicht auf Größen von Arrays zu. –