C
groovemaster schrieb:
Ist das beim medium memory model so?
Ich dachte, unter DOS unterscheidet man generell zwischen near und far Zeigern. Near Zeiger beinhalten nur den Offset Anteil des aktuellen Segments, sind also 16 Bit. Far Zeiger beinhalten Offset und Segment, sind also 32 Bit.
im prinzip schon, nur ist das ja kein standard - für den sind ja alle datenpointer gleich in dem sinne, dass man sie sicher nach void* und zurück casten kann. deshalb gibt es diese speichermodelle ja - jedes modell bedingt gewisse einschränkungen, die den default-pointertyp beeinflussen. und für medium und grössere modelle sind eben mehrere datensegmente vorgesehen, so dass datenpointer dann eben 4 byte brauchen.
ich meine,was für einen sinn hat es, wenn man mit einem size_t ein array >addressierbarer speicher darstellen kann. genauso unlogisch ist es meiner meinung, wenn ein char[size_t(-1)] kleiner als der speicherbereich ist, der addressierbar ist. Daraus folgerte ich halt dann: size_t ist so groß, wie der speicher den das system maximal zur verfügung stellen kann.
und genau letzteres ist eben nicht sinnlos - segmentierte adressierung bringt eine vielzahl von konzepten, die ansonsten sehr simpel wären, durcheinander. bei segmentierter addressierung kann ich eben nicht den gesamten speicher linear durchlaufen, sondern immer nur stücke davon - auf grund der anforderungen, die C an die pointerarithmetik in arrays stellt, heisst das aber, dass ein einzelnes array (und damit jeder datentyp) nicht grösser als ein segment sein kann. das ist auch der grund, warum es keine portable (standardisierte sowieso nicht) methode gibt, um pointer für beliebige datentypen korrekt auszurichten.
es gibt im übrigen eine vielzahl von systemen, bei denen der adressierbare speicher zwar von der grösse 2^n ist, aber n eben nicht ein vielfaches eines bytes ist, so dass es - wenn man die bedingung stellte, dass size_t genau den bereich darstellt, den man adressieren kann - evtl. gar keinen fundamentalen integralen typ gibt, der size_t entspricht.