Frage

Wenn malloc und ähnliche Speichermanipulation zu tun ich mich verlassen kann auf sizeof (char) wird immer 1?

Zum Beispiel muss ich Speicher für N Elemente vom Typ char zuzuordnen. Ist Multiplikation mit sizeof( char ) notwendig:

char* buffer = malloc( N * sizeof( char ) );

oder kann ich mich verlassen sizeof (char) immer 1 sein und nur die Multiplikation überspringen

char* buffer = malloc( N );

Ich verstehe vollkommen, dass sizeof während der Kompilierung ausgewertet wird und dann könnte der Compiler auch die Multiplikation kompiliert und so wird die Leistungseinbuße minimal und höchstwahrscheinlich gleich Null sein.

Ich frage in erster Linie um Code Klarheit und Portabilität. Ist diese Multiplikation je notwendig für char Typ?

War es hilfreich?

Lösung

Während es ist nicht notwendig, halte ich es für eine gute Praxis in der sizeof (char) zu verlassen, weil sie den Code besser lesbar macht und vermeidet die Verwendung einer magischen Zahl. Auch wenn der Code geändert werden muss später, so dass anstelle eines char es mallocing die Größe etwas in einen Zeiger für das Objekt, es ist einfacher, den Code zu ändern, als wenn Sie nur eine „1“.

Andere Tipps

Nach Definition sizeof (char) ist immer gleich 1. Ein Byte ist die Größe der Zeichen in C, was die Anzahl der Bits in einem Byte dort (8 auf gemeinsamer Desktop-CPU) ist.

Das typische Beispiel, bei dem ein Byte ist nicht 8 Bit ist die PDP-10 und alte, Mini-Computer-Architekturen wie mit 9/36 Bits Bytes. Aber Bytes, die nicht 2 ^ N ist immer extrem selten Ich glaube

Auch ich denke, die bessere Art ist:

char* buf1;
double* buf2;

buf1 = malloc(sizeof(*buf1) * N);
buf2 = malloc(sizeof(*buf2) * N);

, weil es funktioniert, was auch immer der Zeiger-Typ ist.

sizeof(char) ist immer 1, egal welche Art von Speichermanipulation Sie tun.

Allerdings sizeof(TCHAR) abhängig von Ihren Compiler-Optionen variieren kann.

Ich halte es irgendwie ein anti-Muster . Es signalisiert, dass der Programmierer nicht ganz, was er / sie tat, was sofort den Rest des Codes in fragwürdigem Licht wirft.

Zugegeben, es ist nicht (Zitat Wikipedia) „unwirksam“, aber ich finde es „bei weitem nicht optimal“. Es hat nichts zu Laufzeit kosten, aber es clutters der Code mit unnötigem Müll, die ganzen Zeit signalisiert, dass jemand dachte, es notwendig ist.

Beachten Sie auch, dass der Ausdruck nicht als Funktionsaufruf nicht analysieren: sizeof keine Funktion ist. Du nennst keine Funktion es das magische Symbol char vorbei. Sie sind der eingebauten in einstelligen Präfixoperator sizeof zu einem Ausdruck der Anwendung und Ihr Ausdruck ist in diesem Fall eine Besetzung auf den Typ char, die in C als (char) geschrieben wird.

Es ist durchaus möglich, und hoch, wann immer möglich zu empfehlen, sizeof auf anderen Ausdrücke zu verwenden, es wird dann die Größe des Wertes des Ausdrucks ergeben:

char a;
printf("A char's size is %u\n", (unsigned int) sizeof a);

Dies druckt 1, immer, bei den konformen C-Implementierungen.

ich stark auch mit David Cournapeau einverstanden und betrachte die Art Wiederholung name in einem malloc()-Aufruf auch seine Art eines Anti-Muster.

Anstelle von

char *str;

str = malloc(N * sizeof (char));

, dass viele schreiben würden einen N-Zeichen-Kapazität String-Puffer zuzuordnen, würde ich gehen mit

char *str;

str = malloc(N * sizeof *str);

oder (für Strings nur) auslassen der sizeof nach oben, aber natürlich ist allgemeiner und funktioniert genauso gut für jede Art von Zeiger.

Es ist nicht notwendig. Siehe hier (zum Beispiel).

sizeof(char) wird durch den C-Standard definiert ist immer sein 1 (Byte). Beachten Sie, dass, weil sizeof eine Anzahl von zurückgibt Bytes die Anzahl der Bits pro Byte ist irrelevant (und in der Praxis ist 8 sowieso).

Etwas anderes im Auge zu behalten ist, dass die Compiler statisch den Wert von sizeof (char) kennen, sind 1 und es weiß auch, dass durch eine statisches 1 eine Zahl multipliziert die Multiplikation bedeutet nicht getan werden muss; der Compiler optimieren Sie es heraus. Anliegen der Leistung sollten nicht eingeben, um Betrachtung aus diesen Gründen.

Von "New-C-Standard. Einem wirtschaftlichen und kulturellen Kommentar".

  1. Statistik: 2,0% sizeof stammt aus char und 1,5% - von unsigned char. Seite 1033 in Version 1.2 des Buches.
  2. Seite 1037
  

Die Anzahl der Bits in der Darstellung eines Zeichentyps ist,   irrelevant. Nach Definition der Zahl   von Bytes in Byte ist ein Zeichentyp   ein.

     

Codierrichtlinien Entwickler manchmal   ein Byte assoziieren wie immer enthalten   acht Bits. Auf Hosts, wo die   Zeichentyp ist 16 Bit, kann dies   führen zu der falschen Annahme, dass   Anwendung sizeof in einen Zeichentyp   kehrt den Wert 2.   Diese Fragen werden an anderer Stelle diskutiert.

Mit dem sizeof (char) macht den Code besser lesbar und tragbar.

Auf x86, wir alle wissen, dass ein Charakter 1 Byte ist. Aber das Schreiben ausdrücklich nach unten hilft, Ihre Absichten klarer machen, das ist immer eine gute Sache.

Auch was, wenn Ihr Code auf einer anderen Plattform gestellt wird, wo ein Zeichen, das nicht 1 Byte ist. Was passiert, wenn ein Charakter war nur 4 Bits statt?

Zugegeben, es ist nicht nötig, aber nicht Ihre Laufzeit verlangsamen und es wird in diesem seltenen Fall, dass Sie Ihren Code in eine andere Architektur müssen Port auszuzahlen.

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