006
18.05.2012, 09:19 Uhr
ao
(Operator)
|
Zitat von banshee: |
frage ich mich, ob die nächste Variable immer an der Adresse &x+i liegt. Wenn der Typ sehr groß ist und mehr Speicher einnimmt, stimmt die Adressierung doch nicht mehr oder doch?
|
Doch. Es ist eine der Grundregeln in C und C++, dass Array-Elemente direkt aneinander grenzen und dass mit *(p+i) auf das i-te Element zugegriffen werden kann. Der Compiler verspricht, die Elemente so im Speicher anzuordnen, dass das geht.
Wenn der Compiler Padding verwendet, um auf die nächste Wortgrenze zu kommen (bei Arrays von Strukturen kommt das häufiger vor), berücksichtigt er das in seiner Zeigerarithmetik und zählt die Padding-Bytes mit.
Zitat: |
Mal abgesehen davon, dass man ungeschützt auf den Speicher zugreifen kann,
|
Was meinst du damit? Wenn man zuvor das Vektor-Template benutzt hat, um den Speicher anzulegen, dann kann man davon ausgehen, dass alles in Ordnung ist. Andernfalls hat das Template einen Bug.
Und wenn man mit einem Index kommt, der zu groß ist und hinter das Vektor-Ende greift: Das darf immer krachend abstürzen, es sei denn, das Vektor-Template behauptet, Schutz davor zu bieten. In dem Fall müsste der Index vor der Verwendung geprüft werden, und Debug-Versionen (#ifdef _DEBUG oder so) machen das häufig auch - auf Kosten der Performance. Dieser Post wurde am 18.05.2012 um 10:57 Uhr von ao editiert. |