Frage

Ich schrieb vor kurzem einige Codes, der die gleichen unsigned short, um zwei Werte, um ein Ergebnis und eine ID, zum Beispiel verwendet:

unsigned short data = new_id();
// result is either 0 or 1 so store it in the rightmost bit and move the id left
data = (data << 1) + get_result();
// ... later ...
// now we can print results like
printf("%u: %u\n", data & 1, data >> 1);

Wäre es besser, nur eine Struktur zu verwenden, um beiden Werte zu halten, oder ist diese Art der Sache common / akzeptabel? Das Programm bereits speichert so viel Speicher ich dachte, dass ich anfangen würde, Wege zu finden, den Speicher zu verringern es verbraucht.

War es hilfreich?

Lösung

Bitfelder (aber nur, wenn Sie wirklich brauchen, eng auf Platz zu sein - dh eingebettete Systeme )?

typedef struct id_result {
    unsigned int id : 15;
    unsigned int result : 1;
} id_result;

sonst, ja, verwenden Sie eine Struktur mit vollständigen und sinnvoll zu definieren:

typedef uint16 IDTYPE; /* assuming uint16 exists elsewhere */

typedef struct id_result {
    IDTYPE id;
    bool result;
} id_result;

Andere Tipps

Es sei denn, Speicher unglaublich eng ist, würde ich die Struktur Weg gehen. Es ist viel klarer, dass die Art und Weise und einfacher für die nächste Person, die Ihren Code hat zu halten.

Ich bin von der Zeit erinnert, als die M68000 32-Bit-Adressregister hatte aber nur 24 Bits von ihnen wurden tatsächlich verwendet wird. Programmierer haben alle Arten von „Optimierungen“ Informationen in den anderen 8 Bits zu speichern. Oh Mann, waren ihre Gesichter rot, wenn neuere Versionen des Chips, wie die M68030, alle 32 Bits verwendet wird.

Es wäre denn, es gibt absolut Knirschen des Gedächtnisses ist, würde ich eher für einfacheren Ansatz geht Struktur mit zwei verschiedenen Variablen zu haben. Es erhöht die Lesbarkeit und reduziert den Wartungsaufwand.

Wenn dies ausschließlich zu dem Zweck getan wird, um die Speichernutzung zu reduzieren, dann glaube ich, du es nicht tun sollte. Sie sind besser dran, eine Struktur mit zwei Shorts verwendet, die den Code viel besser lesbar machen. Die Größe des Speichers Sie, indem Sie diese sehr klein sparen im Vergleich zu den Leistungen, die Sie erhalten, indem der Code besser verwaltbar.

Ich schlage vor, Sie zuerst die System-Profil, um herauszufinden, ob es irgendwelche Speicherlecks oder ob jemand unnötig ist die Zuteilung der großen Teile des Speichers usw., und dann versuchen, dieses Problem zu lösen. Wenn nach wie vor können Sie keine Lösung finden, dann herausfinden, welcher Teil des Programms nimmt den größten Teil des Speichers und versuchen, seine Speicherzuordnung Modell neu zu gestalten.

Um diejenigen, die davon abraten Speicher spar mit bitfields: wie die Jahre vergehen und Computer bekommen mehr Gigabyte, L1 $ (der schnelle Speicher) bleibt nur ein paar Dutzend Kilobyte. Für die meisten Anwendungen heute wird ein Großteil der Zeit mit Warten verbracht für langsame Speicher in dem L1 $ zu gelangen.

Da langsamer Speicher die Engpass bei den meisten Anwendungen ist, einen Speicher mit bitfields Erhaltung tatsächlich signifikant eine Anwendung Geschwindigkeit erhöhen. Das war nicht so wahr vor zwanzig Jahren.

Montage beide Shorts in einem einzigen kurzen selbst ist, meiner Meinung nach, mehr Arbeit und mehr fehleranfällig als eine Struktur verwendet wird. Wenn weniger Speicher benötigt wird wirklich erforderlich ist, können Sie bitfields mit einer Struktur angeben:

struct myStruct {
int data:8;
int result:8;
};

Es erreicht das gleiche Speichermindernde Ergebnis, während die Gesamt Wartbarkeit des Codes zu erhöhen.

Structs mit bitfields ist die verständlichste Umsetzung. Wenn Sie nicht über diesen Ansatz verwenden, können Sie einen Satz mit gut dokumentiert Makros , dass Pack und entpacken Sie das Wertepaar in der und aus den 16-Bit-Werten.

Mit structs / Objekte ist nicht unbedingt die beste oder klarste Ansatz.

Angenommen, Sie eine Reihe von einfachen Integer-Datenpunkte haben, aber sie können ungültig gelöscht oder markiert werden, wenn man einfach die MSB-Flag verwenden als ‚nicht verwenden‘ und dann alles, was Sie für den Algorithmus hinzufügen müssen, ist ein

if ( item > 0 )
   item += blah

Wenn Sie aber eine Struktur haben, dann muss jedes Stück arithmatic jetzt ein Mitglied Zugang

if ( item.valid() ) 
   item.setValue(item.getValue() + blah);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top