Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

wunhopkuendo

Frischling

  • »wunhopkuendo« ist der Autor dieses Themas

Beiträge: 31

Beruf: Student

  • Private Nachricht senden

1

03.01.2014, 14:20

size_t besser?

Hey Leute,

nur ne kurze Frage, ist es besser für Array-Indizes und für Laufvariablen von for-Schleifen, die Arrays verarbeiten
statt int size_t zu verwenden?


Grüße
wunhopkuendo

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

03.01.2014, 14:49

Inwiefern "besser"? Im Allgemeinen kann man das nicht so sagen... ;)

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

3

03.01.2014, 14:56

Es ist insofern besser geeignet, als das es genau so groß ist wie Pointer und somit alle möglichen Indices repräsentiert werden können.
Wie man auch auf Wikipedia nachlesen kann, ist die Breite von "Int" mehr oder weniger fast willkürlich. Mit "std::size_t" ist man auf der sicheren Seite. Der Datentyp skaliert mit der Architekturbreite mit. Array-Indices sind nunmal in der Praxis eigentlich genau genommen immer so Breit wie "std::size_t", alles andere muss (meist implizit) gecastet werden.
Zum Beispiel bei

C-/C++-Quelltext

1
2
std::vector<T> VectorObj;
int VectorObjSize = VectorObj.size();

sollte der Compiler in vielen Fällen eine Warnung ausstoßen.

Solche Ärgernisse wie bei zlib, dass die maximale Datenmenge vom Compiler abhängt, gibt es dann auch nicht.

4

03.01.2014, 16:48

Zitat

als das es genau so groß ist wie Pointer
Das ist ein häufiges Missverständnis – uintptr_t ist genau so groß wie die größten Zeiger. size_t hingegen könnte z.B. auf 64-Bit Win32 immernoch nur 32 Bits groß sein, obwohl alle Zeiger 64 Bits groß sind – weil keine Datentypen oder Arrays größer 2 GiB erlaubt sind und man ergo nur 31 Bits für jede mögliche Größenangabe benötigt. Das schränkt natürlich nicht die Nutzbarkeit als Index ein; aber verbietet das Casten zwischen Zeigern und size_t.

Für Schleifen sollte man aber in den meisten Fällen sowieso keine Laufvariablen benutzen sondern Iteratoren.

Wenn man es doch tun muss, siehe dot: Es kommt auf den Fall an. int kann bspw. in wenigen Fällen bessere Optimierungen erlauben; in anderen Fällen das Programm komplett zerstören.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

03.01.2014, 16:52

size_t hingegen könnte z.B. auf 64-Bit Win32 immernoch nur 32 Bits groß sein, obwohl alle Zeiger 64 Bits groß sind – weil keine Datentypen oder Arrays größer 2 GiB erlaubt sind und man ergo nur 31 Bits für jede mögliche Größenangabe benötigt.

Ich gehe davon aus, du meinst dies als hypothetisches Beispiel!? Oder meinst du tatsächlich, dass man unter 64-Bit Windows keine Arrays über 2GiB haben kann?

6

03.01.2014, 16:59

auto foo = new int[3ull * 1024 * 1024 * 1024];
error C2148: total size of array must not exceed 0x7fffffff bytes

Wenn du dich selber um die Speicherverwaltung kümmerst (VirtualAlloc() & Co.), bekommst du es natürlich hin – aber Visual C++’ CRT gibt knapp unter 2 GiB auf. Nichts würde den Compiler also davon abhalten, size_t 32-bittig zu halten, denn in der C++-Welt kommt der Speicher ja nur via new :-)

(Da liegt auch mein Fehler – ich hatte in Erinnerung, auch in meinen 64-Bit-Programmen keinen zusammenhängenden Block von über 2 GiB kriegen zu können, wenn ich direkt über die WinAPI gehe. Scheint aber zu funktionieren; keine Ahnung, was ich da verbockt hatte. Also Visual C++ kann nicht mehr, nicht Win32)

Es bleibt aber dabei, dass Addressraumgröße und Objektgröße unterschiedliche Konzepte sind, die durch unterschiedliche Typen (uintptr_t vs. size_t) abgebildet werden und nicht durcheinandergeschmissen werden dürfen.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Krishty« (03.01.2014, 17:07)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

03.01.2014, 17:10

Oha, tatsächlich, das war mir neu...

Edit: Hier findet sich eine Begründung die Sinn macht...

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (03.01.2014, 17:17)


8

03.01.2014, 17:36

Ja; klingt sinnvoll. Ich kann mir außerdem vorstellen, dass es die Erkennung von Integer-Überläufen bei Allokationen erleichtert (für Microsoft war ein gefürchteter Angriffsvektor, eine Anwendung so viele Elemente allokieren zu lassen, dass n * sizeof(Element) überläuft, die Anwendung zu wenig Speicher reserviert, und dann in den Heap dahinter schreibt).

wunhopkuendo

Frischling

  • »wunhopkuendo« ist der Autor dieses Themas

Beiträge: 31

Beruf: Student

  • Private Nachricht senden

9

03.01.2014, 18:12


Inwiefern "besser"?

mit besser meine ich , dass size_t ja prinzipiell besser passt (vom Sinn her) um die Größe eines Arrays zu definieren,
size_t ist ja ähnlich wie int, aber
trotzdem wäre size_t dann für den Sinn präziser, oder?

10

03.01.2014, 19:13

Ja, unabhängig von irgendwelchen Implementierungen sagt dir die Deklaration schon dass du in dieser Variable keine "normalen" Zahlen speichern willst, sondern eben Array-Größen oder so.
Lieber dumm fragen, als dumm bleiben!

Werbeanzeige