divide and conquer / size_t und size_type / Bezeichner von Konstanten
-
Warum die nicht durch -Wall oder -Wextra aktiviert wird, habe ich mich auch schon gefragt
-
brotbernd schrieb:
Gugelmoser schrieb:
Verwendet ihr, wenn etwas nicht <0 werden kann, einen unsigned Typen?
i.d.R. ja.
Ist es angebracht, dann einfach immer size_t zu benutzen?
-
Gugelmoser schrieb:
Ist es angebracht, dann einfach immer size_t zu benutzen?
Nein. size_t hat eine besondere Semantik: Es ist speziell für Speichergrößen und positionen im Speicher gedacht. Für Sachen wie: "wie viele gerade zahlen gibt es in diesem Array" würde ich daher als Ergebniswert unsigned nehmen.
-
Ich persönlich mag
size_t
nicht. Es führt neue integrale Typen in C++ ein und macht Code inkonsistenter. Alleine schon die beiden Frontensize_t
undstd::size_t
... Ausserdem benötigt man dazu einen Header (auch wenn dieser meist indirekt eingebunden wird).Und
std::vector::size_type
ist ganz schlimm, erneut ein Stück Generizität für gar nichts. Es schafft wieder die Notwendigkeit neuer Konvertierungen, wobei die Fehleranfälligkeit bei solch intransparententypedef
s lediglich steigt.Betrachtet man nur aktuelle Architekturen, fände ich
unsigned int
als Standardlösung gar keinen so schlechten Kompromiss.otze schrieb:
Nein. size_t hat eine besondere Semantik: Es ist speziell für Speichergrößen und positionen im Speicher gedacht. Für Sachen wie: "wie viele gerade zahlen gibt es in diesem Array" würde ich daher als Ergebniswert unsigned nehmen.
Hier fängts schon an. Vergleiche mal die Rückgabetypen von
std::vector::size()
,std::count()
und deinerAnzahlGeradeZahlen()
-Funktion. 3 verschiedene Typen, um eine Anzahl zu erhalten. Das kanns doch nicht sein.
-
otze schrieb:
Für Sachen wie: "wie viele gerade zahlen gibt es in diesem Array" würde ich daher als Ergebniswert unsigned nehmen.
Mir scheint der Wertebereich hierfür ist der der Größe des Arrays, und somit unmittelbar mit size_t verknüpft.
-
otze schrieb:
Gugelmoser schrieb:
Ist es angebracht, dann einfach immer size_t zu benutzen?
Nein. size_t hat eine besondere Semantik: Es ist speziell für Speichergrößen und positionen im Speicher gedacht. Für Sachen wie: "wie viele gerade zahlen gibt es in diesem Array" würde ich daher als Ergebniswert unsigned nehmen.
Des können aber ein guter Haufen mehr sein als in einen "unsigned" reinpassen.
"unsigned" ist mit MSVC (sowie vermutlich allen anderen Windows Compilern) und Target = x64 nämlich 32 Bit gross. Genau so wie long dort immer noch 32 Bit gross ist.
Nur um ein Beispiel zu nennen.
-
hustbaer schrieb:
Nur um ein Beispiel zu nennen.
dann mach unsigned long draus. An der Semantik ändert das 0.
-
otze schrieb:
hustbaer schrieb:
Nur um ein Beispiel zu nennen.
dann mach unsigned long draus. An der Semantik ändert das 0.
Hä? Was soll das helfen?
unsigned long ist mit MSVC/64 Bit auch nur 32 Bit gross (genau wie bei MSVC/32 Bit).
Du müsstest schon unsinged long long nehmen.
Nur unsinged long long könnte wieder grösser als nötig sein, z.B. weil es auf 32 Bit Systemen auch 64 Bit hat.size_t ist so gross, wie "Dinge" im Speicher platz haben.
-> size_t ist für sowas genau das Richtige.Wieso kompliziert, wenns einfach auch geht?
-
hustbaer schrieb:
Wieso kompliziert, wenns einfach auch geht?
? Du glaubst doch nicht ernsthaft, dass die letzten 4 Posts von mehr als nur akademischen Interesse sind?
-
Schauen wir uns an, wieviele Tage seit der Geburt Jesu' vergangen ist: Garantiert unsigned.
Aber bilden wir uns nicht zuviel auf unsere Software und deren Einsatz in der Zukunft ein? Sollen wir wirklich einen 64-bitter zurückzugeben?
Ich denke schon.
-
hustbaer schrieb:
Wieso kompliziert, wenns einfach auch geht?
Finde ich auch. Deswegen benutze ich kein unsigned mehr.
-
otze schrieb:
hustbaer schrieb:
Wieso kompliziert, wenns einfach auch geht?
? Du glaubst doch nicht ernsthaft, dass die letzten 4 Posts von mehr als nur akademischen Interesse sind?
Klar sind sie das.
Du glaubst doch nicht ernsthaft dass ich dich jetzt noch ernst nehmen kann?