was passiert bei ReDim() im Hintergrund?
- 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?
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()`.
Re: was passiert bei ReDim() im Hintergrund?
Vermutlich schon.
Meine Ergebnisse
Alternative, mit großem Feld anfangen...
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
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
- 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?
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.
- juergenkulow
- Beiträge: 188
- Registriert: 22.12.2016 12:49
- Wohnort: :D_üsseldorf-Wersten
Re: was passiert bei ReDim() im Hintergrund?
Installiere x64dbg.
Finde SYS_ReAllocateArray in der EXE Datei.
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).
Code: Alles auswählen
; ReDim Feld(2)
MOV rdx,a_Feld
MOV rcx,3
CALL SYS_ReAllocateArray
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 |
Führe mehrere Einzelschritte aus mit F7 oder animiert mit Strg-F7 oder getraced mit Strg-Alt-F7 (41 KB Logdatei).