Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Memory Alignment
TRomano - Mi 10.09.03 10:12
Titel: Memory Alignment
Unter Delphi7 habe ich das Problem, das keine explizite Angabe der Datenausrichtung möglich ist (wie z.b. in C++ mit Align(16) oder MASM mit ALIGN 16). Dadurch entfallen beim Inline-Assembler leider SSE2-Befehle wie MOVDQA, die an der 16Byte-Grenze ausgerichtet sind.
Das bedeutet aber gerade beim Moven von daten erhebliche geschwindigkeitsverluste. Gibt es eine Möglichkeit die Daten trotzdem an 16 Byte auszurichten ?
Danke.
AndyB - Mi 10.09.03 10:25
Du könntest den Speicher mit VirtualAlloc reservieren. Dieser ist auf 4KB ausgerichtet (was durch 16 Teilbar ist).
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| function VAllocMem(Size: Integer): Pointer; begin Result := VirtualAlloc(nil, Size, MEM_COMMIT, PAGE_READWRITE); end;
procecedure VFreeMem(var P); begin VirtualFree(Pointer(P), 0, MEM_FREE); end; |
maximus - Mi 10.09.03 15:01
Also ich weiss, dass man mit der direktive {$A} das alignment von records und klassen-feldern ändern kann! Ob man das aber auch mit 16 byte machen kann und ob dir das hilft, weiss ich nicht?
viel glück
AndyB - Mi 10.09.03 23:59
{$ALIGN x} geht nur mit 1, 2, 4 und 8. Die 16 wird noch nicht unterstützt.
TRomano - Mo 15.09.03 13:20
Die Allokierung von Speicher erfolgt bei meinem Projekt (Arrays) automatisch, da ich in der Hauptsache mit dynamischen Arrays arbeite. Daher sind die Daten mal auf 4,8 oder 16 Byte ausgerichtet. nach langen Probieren und Studieren (System.pas) bin ich zu dem Schluss gekommen, dass Delphi7 mir hier nicht weiter hilft. Trotzdem herzlichen Dank !!!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!