Frage

GCC 4.4.1, C99

ich benutze size_t, und size_t ist ein unsigned int. Dies hängt jedoch davon ab, ob Sie 32 Bit oder 64 Bit ausführen.

Ich werde verwenden size_t die Größe eines Puffers speichern.

Ich denke also nicht, dass dies sehr tragbar wäre, wenn sie über Architekturen hinweg verwenden.

Nur eine Frage mit Verwendung size_t entweder auf einem 32 oder 64 Bit. Welche Situationen würden das schwerwiegendste Problem verursachen?

War es hilfreich?

Lösung

size_t kann garantiert die Anzahl der Bytes eines Objekts für Ihre Implementierung halten. Deshalb die Rückkehrtyp sizeof ist size_t.

Also ja, es ist tragbar.

Andere Tipps

Wie andere gesagt haben, size_t ist korrekt und vollkommen akzeptabel, um das Ergebnis von zu speichern sizeof() oder die Größe eines darstellbaren Objekts in Bytes. Was Sie aufpassen müssen, ist Folgendes:

  1. size_t ist die gleiche Größe wie einige unsignierte Ganzzahltypen. Es ist nicht unbedingt die gleiche Anzahl von Bytes wie der größte nicht signierte Ganzzahltyp, unsigned int, unsigned long, etc.
  2. sizeof(size_t) ist eine implementierungsdefinierte Anzahl von Bytes so memcpy'es oder zu einem anderen ganzzahligen Typ zuzuweisen als uintmax_t ist eine schlechte Idee. Ich bin mir nicht einmal sicher, ob es sicher anzunehmen ist, dass es gleich groß oder kleiner ist als uintmax_t.
  3. Schreiben ein size_t Wert für eine binäre Datei und das Lesen in a size_t Durch einen anderen Prozess, auf einer anderen Maschine oder durch etwas, das mit verschiedenen Compiler -Optionen zusammengestellt wurde, kann Ihre Gesundheit gefährlich sein.
  4. Senden a size_t Wert in einem Netzwerk und versuchen, es mit a zu empfangen sizeof(size_t) Puffer auf der anderen Seite ist eher unsicher.

All dies sind Standardprobleme bei jedem anderen Ganzzahl -Typ außer unsigned char. So size_t ist genauso tragbar wie jeder andere ganzzahlige Typ.

Es ist sinnvoll, size_t oder ssize_t für einen Puffer zu verwenden, wenn Sie malloc () oder read () verwenden. Für die Portabilität verwenden Sie size_max, ssize_max, sizeof (Typ-in-your-buffer) und %ZD oder %Zu Printf ().

Sie haben auch OFF_T und PTRDIFF_T / SSIZE_T, die zwischen den Architekturen auf die gleiche Weise variieren.

Wenn Sie sie richtig verwenden, sind sie über Architekturen hinweg tragbar. Bei einem 32-Bit-System sind sie alle 32 Bit breit, während sie auf einem 64-Bit-System alle 64 Bit breit sind. Dies ist, was Sie wollen-die Größe eines Puffers kann unmöglich größer als eine 32-Bit-Größe auf einem 32-Bit-System sein, aber es kann bei einem 64-Bit-System weitaus größer sein.

Sie sollten niemals INTs, Longs oder irgendetwas anderes verwenden. Abgesehen von allem variiert die Größe eines langen Abhörens von der Plattform (32 Bit an den meisten 32-Bit-Systemen, 64-Bit-Systeme auf 64-Bit-UNIX-Systemen, 32-Bit auf 64-Bit-Fenstern).

Es ist schwer herauszufinden, was Sie mit "tragbar" in diesem Fall meinen. Der Begriff "tragbar" ermöglicht mehrere sündigartig unterschiedliche Interpretationen.

Typ size_t hat einen sehr spezifischen Zweck. Es kann die Größe jedes Objekts in der angegebenen Implementierung halten. Dh es ist ein Typ, der immer das Ergebnis von empfangen kann sizeof() Operator. Typ size_t hat keinen anderen Zweck, und innerhalb seiner beabsichtigten Anwendung ist es zu 100% tragbar, so tragbar, wie alles sein kann.

Nach welcher Art von "tragbarem" Sie fragen, dass Sie wieder nicht klar sind.

Sie sollten nicht davon ausgehen, dass size_t ein nicht signiertes int ist (Siehe diese Antwort), aber ich denke, es hat den gleichen Bereich bei beiden Architekturen.

Hängt davon ab, wofür Sie size_t verwenden.

Wenn Sie es verwenden, um die Größe eines Speicherpuffers zu bestimmen, ist es sicher, da Size_t groß genug ist, um den gesamten Speicher eines Computers anzusprechen. Wenn der Speicherpuffer größer ist, haben Sie trotzdem ein Problem.

Wenn Sie es dagegen als generische unsignierte Ganzzahl verwenden, um die Anzahl der Sterne im Universum zu zählen, haben Sie möglicherweise ein Problem auf 32-Bit-System (nicht sicher über 64-Bit-Systeme).

Das einzig ernsthafte Problem damit besteht darin, auf ein ziemlich großes Array oder eine große Anzahl für size_t zuzugreifen.

Genau wie nur ein normaler "int" ausreichend auf einem 64-Bit, könnte aber einen Absturz auf einem 32-Bit-Absturz verursachen, weil es für ein INT auf einem 32-Bit-System zu groß ist.

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