was passiert bei ReDim() im Hintergrund?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: was passiert bei ReDim() im Hintergrund?

Beitrag von NicTheQuick »

Die ändert sich immer nur dann, wenn das Betriebssystem merkt, dass nicht mehr genug Platz dahinter ist um den Speicherbereich an Ort und Stelle zu verlängern. Das ist übrigens das selbe mir `ReAllocateMemory()`.
Benubi
Beiträge: 187
Registriert: 22.10.2004 17:51
Wohnort: Berlin, Wedding

Re: was passiert bei ReDim() im Hintergrund?

Beitrag von Benubi »

Vermutlich schon.

Meine Ergebnisse

Code: Alles auswählen

       2: 2380BC0
       4: 2380BC0
       8: 2380BC0
      16: 2380BC0
      32: 2380BC0
      64: 2380BC0
     128: 2380BC0
     256: 2380BC0
     512: 2380BC0
    1024: 2381C10
    2048: 2383C50
    4096: 221D0C0
    8192: 2225100
   16384: 2235140
   32768: 2255180
   65536: 48F00B0
   98304: 49700F0
  147456: 4AFD070
  221184: 4C2B070
  331776: 4DE7070
  497664: 5084070
  746496: 546A070
 1119744: 4AF1070
 1679616: 5388070
 2519424: 6061070
 3779136: 73A6070
 5668704: 908E070
 8503056: 4AFD070
Alternative, mit großem Feld anfangen...

Code: Alles auswählen

; Die Feldaddresse ändert sich durch ReDim fast immer. 
Dim Feld(10000000)
i=2 
While i<10000000
  ReDim Feld(i)
  Debug RSet(Str(i),8)+": "+Hex(@Feld(0))
  If i<65536 
    i+i
  Else
    i+i/2
  EndIf 
Wend
;        2: 48F4070
;        4: 48F4070
;        8: 48F4070
;       16: 48F4070
;       32: 48F4070
;       64: 48F4070
;      128: 48F4070
;      256: 48F4070
;      512: 2380BC0
;     1024: 2381C20
;     2048: 2383C80
;     4096: 220D0C0
;     8192: 2215120
;    16384: 2225180
;    32768: 22451E0
;    65536: 48F00B0
;    98304: 4970110
;   147456: 4AFC070
;   221184: 4C2C070
;   331776: 4DE7070
;   497664: 5084070
;   746496: 546C070
;  1119744: 4AFA070
;  1679616: 5399070
;  2519424: 6079070
;  3779136: 73C2070
;  5668704: 90A5070
;  8503056: 4AFD070
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: was passiert bei ReDim() im Hintergrund?

Beitrag von NicTheQuick »

Wenn du mit einem großen Feld anfängst und es dann direkt wieder verkleinerst, kann das Betriebssystem den dahinter frei gewordenen Speicher ja wieder für was anderes verwenden. Das passiert ja dauernd in einer Multitasking-Umgebung. Also kein Wunder, dass sich die Speicheradresse auch dann immer wieder verändert.
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

Re: was passiert bei ReDim() im Hintergrund?

Beitrag von juergenkulow »

Installiere x64dbg.

Code: Alles auswählen

; ReDim Feld(2)
  MOV    rdx,a_Feld
  MOV    rcx,3
  CALL   SYS_ReAllocateArray
Finde SYS_ReAllocateArray in der EXE Datei.

Code: Alles auswählen

0000000140001086 | 48:BA BC51004001000000   | mov rdx,redim.1400051BC                                       | rdx:"Hƒì(IÇÀ0"
0000000140001090 | 48:C7C1 03000000         | mov rcx,3                                                     |
0000000140001097 | E8 88110000              | call redim.140002224                                          |
Makiere die Stelle und führe bis dahin aus mit F4.
Führe mehrere Einzelschritte aus mit F7 oder animiert mit Strg-F7 oder getraced mit Strg-Alt-F7 (41 KB Logdatei).
Antworten