Ist es notwendig, durch sizeof (char) zu multiplizieren, wenn der Speicher zu manipulieren?
-
06-07-2019 - |
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?
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".
- Statistik: 2,0% sizeof stammt aus
char
und 1,5% - vonunsigned char
. Seite 1033 in Version 1.2 des Buches. - 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.