Frage

Ich arbeite an einem Speicherpool Implementierung und ich bin ein wenig verwirrt über Zeiger Ausrichtung ...

Nehmen wir an, dass ich einen Speicherpool, die feste Größe Speicherblöcke austeilt, an der Stelle des Speicherpools Schaffung ich malloc ((Größe) * (num von Blöcken)). Wenn das, was zugeordnet Wesen sind Objekte und die Größe kommt aus dem Operator sizeof Ausrichtung kein Problem sein sollte, aber wenn die Größe uneben ist (er / sie will 100-Byte-Blöcke für welchen Gründen auch immer), dann, wenn ich die Brocken von malloc gegeben gespalten ich würde oben mit nicht ausgerichteten Zeiger beenden. Meine Frage ist, soll ich immer die Blöcke bis zu einem gewissen Grenze ausgerichtet und wenn ja welche?

War es hilfreich?

Lösung

X86 wird ohne Ausrichtung arbeiten, aber die Leistung ist besser, wenn Daten ausgerichtet ist. Ausrichtung für type ist im Allgemeinen sizeof ( type ), bis zu einem Maximum von 16 (Bytes).

Ich schrieb dieses dumme Testprogramm nur um sicher zu sein (asuming malloc weiß, was seine tun), und es gibt 16 auf meiner amd64 Box. Es gibt 8, wenn in 32-Bit-Modus kompiliert:

#include <stdlib.h>
#include <stdio.h>

int main() {
    int i;
    unsigned long used_bits = 0, alignment;

    for (i = 0; i < 1000; ++i) {
        used_bits |= (unsigned long)malloc(1);   /* common sizes */
        used_bits |= (unsigned long)malloc(2);   
        used_bits |= (unsigned long)malloc(4);
        used_bits |= (unsigned long)malloc(8);
        used_bits |= (unsigned long)malloc(16);
        used_bits |= (unsigned long)malloc(437); /* random number */
    }

    alignment = 1;
    while (!(used_bits & alignment)) {
        alignment <<= 1;
    }

    printf("Alignment is: %lu\n", alignment);
    return 0;
}

Andere Tipps

Die richtige Ausrichtung zumindest hilfreich ist (Performance-weise) auf den meisten x86-Implementierungen (und eine Art von Ausrichtung ist in anderen Architekturen tatsächlich obligatorisch). Sie fragen könnten (wie calloc tut) für ein Paar von Argumenten, die Größe der Elemente in Bytes und Anzahl der Elemente, anstatt nur eine (in Bytes, wie malloc der Fall ist); dann können Sie an sich ausrichten (von Blockgrößen Aufrundung) an die nächsthöhere Potenz von 2 über der Objektgröße (aber über 16 auf ein Vielfaches von 16 Byte wechseln, halten nicht ewig verdoppeln, wie @derobert empfiehlt und erklärt! -). Auf diese Weise, wenn ein Anrufer will nur Bytes N w / o jeder Ausrichtung noch Polsterung, können sie immer für N Elemente von 1 Byte fragen jedes (wie sie es mit calloc und aus dem gleichen Grund, -).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top