2010-06-06 11 views
5

Mögliche Duplizieren:
When to use std::size_t?Ist es empfehlenswert, std :: size_t überall zu verwenden?

Ich habe eine Menge von Konstanten in meinem Code, die Zahlen ohne Vorzeichen sind, z.B. Zähler, Frequenz-Cutoffs, Längen usw. Ich begann für alle diese std::size_t statt int oder unsigned int.

Ist das das Richtige? Ich habe es gestartet, weil die STL-Container es für ihre Größen verwenden, es wird für String-Position usw. verwendet.

+0

Das klingt wirklich erfunden, warum nicht einfach mit int gehen? –

+2

Wirksames Duplikat von [Wann std :: size_t?] (Http://stackoverflow.com/questions/1951519/when-to-use-stdsize-t) –

+0

Siehe: http://stackoverflow.com/questions/ 1951519/wann-zu-verwenden-stdsize-t –

Antwort

8

std::size_t ist der Typ zum Zählen von Speicherorten, wie Array-Längen, die Größe von Objekten, etc. STL-Container sind mit container_type::size_type, die in der Regel Karte zu std::size_t wird, ist aber nicht garantiert, dies zu tun.

Wenn Sie Typen für das Halten nicht-negativen Integrale müssen, die für die oben genannten Zwecke verwendet werden, nicht, was falsch ist mit unsigned short, unsigned int und unsigned long?

2

Sie können size_t für Variablen verwenden, die die Größe von im Speicher gespeicherten Objekten darstellen. Aber es gibt nicht viel Grund, es für irgendetwas anderes zu verwenden. Es existiert hauptsächlich, weil unsigned int möglicherweise nicht breit genug ist, um die Größe eines Speicherobjekts darzustellen. (Betrachten Sie eine Architektur mit 16-Bit-Ints, aber einen 32-Bit-Adressraum.)

3

size_t ist eigentlich ein typedef in stddef.h definiert und es ist Plattform abhängig, so dass Sie nicht wirklich irgendwelche Annahmen darüber machen können. Auf gcc 4.4 (i486) ist es als ein langer unsignierter int definiert, es sei denn, das OS definiert es bereits. So wird es zB auf Free Free BSD 5 auf einer i386 Maschine nicht signiert, während es auf einer ia64 Maschine lange nicht signiert wird. So zum Beispiel , wenn Sie versuchen, wie etwas zu tun

size_t i; 
... 
char buf[4]; 
sprintf(buf,"%u",i); 

Manchmal ist es gonna run, aber auf einigen Plattformen/Compilern du wird einen Pufferüberlauf bekommen.

Mein Punkt ist, dass dies einige unangenehme Portabilitätsprobleme verursachen kann, wenn Sie Annahmen über die Größe/den Typ von size_t machen müssen.

Verwandte Themen