2009-07-31 9 views
2

Dies ist wahrscheinlich eine C++ 101 Frage: Ich bin gespannt, welche Richtlinien für die Verwendung von size_t und offset_t, z. für welche Situationen sie bestimmt sind, für welche Situationen sie nicht vorgesehen sind, usw. Ich habe nicht viel portables Programmieren gemacht, deshalb habe ich typischerweise so etwas wie int oder unsigned int für Arraygrößen, Indizes und dergleichen verwendet. Ich nehme jedoch an, dass es vorzuziehen ist, wenn möglich einige dieser Standardtypdefinitionen zu verwenden, also würde ich gerne wissen, wie man das richtig macht.Richtlinien zur Verwendung von size_t und offset_t?

Als eine Follow-up-Frage, für die Entwicklung unter Windows mit Visual Studio 2008, wo sollte ich suchen, die tatsächlichen Typedefs zu finden? Ich habe size_t in einer Reihe von Headern im VS-Installationsverzeichnis gefunden, so dass ich nicht sicher bin, welche von denen ich verwenden sollte, und ich kann offset_t nirgendwo finden.

+0

Interessante Antworten - vielleicht bin ich falsch, weil "Offset_t" "Standard" ist? – Charlie

Antwort

11

Sie beziehen sich wahrscheinlich auf off_t, nicht offset_t. off_t ist ein POSIX-Typ, kein C-Typ, und es wird verwendet, um Dateioffsets anzugeben (64-Bit-Dateioffsets sogar auf 32-Bit-Systemen zulassen). C99 hat das mit fpos_t ersetzt.

size_t ist zum Zählen von Bytes oder Array-Elementen gedacht. Es entspricht dem Adressraum.

+1

size_t hat die Größe, die benötigt wird, um die Größe des größten Objekts zu enthalten, nicht notwendigerweise den gesamten Adressraum (denken Sie an 16-Bit-Segmentarchitekturen). – AProgrammer

+0

@AProgrammer: Ich habe absichtlich die vagen "Übereinstimmungen" verwendet, um zu beschreiben, wie size_t mit dem Adressraum zusammenhängt. Sie haben recht: size_t ist als Ergebnistyp des Operators sizeof definiert. –

+0

Klingt wie ich sollte size_t für die Zwecke verwenden, die Sie beschreiben, und nicht mit offset_t verwirren. Danke für die Information. – Charlie

1

offset_t wird in meiner Kopie des C++ - Standards überhaupt nicht erwähnt.

size_t auf der anderen Seite, bedeutet einfach, Objekt- oder Array-Größen zu bezeichnen. Ein size_t ist garantiert groß genug, um die Größe jedes In-Memory-Objekts zu speichern, daher sollte es dafür verwendet werden.

1

Sie verwenden size_t immer dann, wenn die C++ - Sprachspezifikation angibt, dass sie in einem bestimmten Ausdruck verwendet wird. Beispielsweise würden Sie size_t verwenden, um den Rückgabewert sizeof zu speichern oder die Anzahl der Elemente in einem Array darzustellen (new[] dauert size_t).

Ich habe keine Ahnung was offset_t ist - es ist nicht einmal in ISO C++ Spezifikation erwähnt.

3

Anstelle von offset_t meinen Sie ptrdiff_t? Dies ist der Typ, der von Routinen wie std::distance zurückgegeben wird. Mein Verständnis ist, dass size_t ist unsigned (um den Adressraum wie bereits erwähnt), während ptrdiff_t ist signiert (theoretisch "rückwärts" Abstände zwischen Zeigern bezeichnen, obwohl dies sehr selten verwendet wird).

+0

Interessante Ergänzung zu der Diskussion - ich wusste nicht über ptrdiff_t, aber es klingt sinnvoll. – Charlie

0

Ziehen eines alten Backups ... offset_t (was sehr lang ist) wird vom Systemaufruf llseek() von Solaris verwendet und sollte überall dort verwendet werden, wo Sie wahrscheinlich eine echte 64-Bit-Datei finden Offsets ... was bedeutet, dass Sie wirklich mit riesigen Dateien arbeiten.

Verwandte Themen