Ben*_*iss 4 delphi struct memory-management record delphi-7
我想得到一个结构/记录的"位置".
说我有这个记录:
type
MyStruct = record
MyInteger : Integer;
MyInteger2 : Integer;
MyInteger3 : Integer;
MyFunc : function (FirstParam : WideString; SecondParam : String) : Integer;
MyString : String;
MyString2 : WideString;
MyPchar : pchar;
end;
Run Code Online (Sandbox Code Playgroud)
如您所见,此记录的大小为28字节(7个字符x 4个字节).基本上因为所有变量都是4字节变量(如整数)或指针(也是4字节).现在假设我们将这个结构加载到一个内存地址(X = 0)(这也意味着MyInteger的地址为0).MyInteger3的地址(例如)将为8(请注意X = 0!)如何动态获取结构的位置(数字/地址)?
希望你们知道我的意思吗?提前致谢.
BTW:结构中任何Var总是4个字节吗?编辑:如果你修复spcae这是错误的:String[100]
您可以使用某些指针算法获取任何记录成员的偏移量:
type
PMyStruct = ^MyStruct;
var
Offset: Integer;
begin
Offset := Integer(@(PMyStruct(nil).MyInteger3));
// or:
// Offset := Integer(Addr(PMyStruct(nil).MyInteger3));
end;
Run Code Online (Sandbox Code Playgroud)
如果你想要函数的偏移量,你需要像这样编码:
Offset := Integer(@@PMyStruct(nil).MyFunc);
// or:
// Offset := Integer(Addr(@PMyStruct(nil).MyFunc));
Run Code Online (Sandbox Code Playgroud)
program OffsetTest; {$APPTYPE CONSOLE}
type
f = function (FirstParam : WideString; SecondParam : String) : Integer;
TStruct = record
MyInteger : Integer;
MyInteger2 : Integer;
MyInteger3 : Integer;
MyFunc : ^f;
MyString : String;
MyString2 : WideString;
MyPchar : pchar;
end;
var MyStruct :TStruct;
begin
Writeln( int64(@(MyStruct.MyInteger )) - int64(@(MyStruct)));
Writeln( int64(@(MyStruct.MyInteger2)) - int64(@(MyStruct)));
Writeln( int64(@(MyStruct.MyInteger3)) - int64(@(MyStruct)));
Writeln( int64(@(MyStruct.MyFunc )) - int64(@(MyStruct)));
Writeln( int64(@(MyStruct.MyString2 )) - int64(@(MyStruct)));
Writeln( int64(@(MyStruct.MyPchar )) - int64(@(MyStruct)));
Readln;
end.
Run Code Online (Sandbox Code Playgroud)
32位版本的结果:
0
4
8
12
20
24
Run Code Online (Sandbox Code Playgroud)
64位版本的结果:
0
4
8
16
32
40
Run Code Online (Sandbox Code Playgroud)
结果为64位,打包记录:
0
4
8
12
28
36
Run Code Online (Sandbox Code Playgroud)
显示不同的结果,指出在代码中依赖这些偏移量可能是个坏主意.或者至少要非常清楚不同情况可能导致不同的偏移.
归档时间: |
|
查看次数: |
688 次 |
最近记录: |