Delphi-配列と構造体
1654 ワード
技術交流、DH解説.
配列と構造体はメモリの中で実は同じで、彼らはすべて連続的に分布していると言ったのを覚えています.例:
どちらも12バイトでTMyStruct.AはT 3 Intarray[0].配列内のある要素にアクセスするとき、最初の要素のアドレス+シーケンス番号*要素のサイズだけであることがわかります.アクセス構造体もそうであるべきであるが、構造体の各要素の大きさは必ずしも同じではなく、配列の各要素は同じである.では、セグメントコードを見てみましょう.
実はこのPはTMyStructの配列を定義することに相当して、5つの要素がありますが、私たちはポインタを定義して、しかも空間を割り当てていません.私はaArrayの空間の上で使用しています.つまりプロセス終了時にaArray空間が回収されるとPは消滅する.逆アセンブリコードを見てください.
構造体のある要素の値にアクセスして修正することも、構造体ポインタの上でオフセットことが明らかになった.はい、次は列挙を見てみましょう.休みです.家で米に網ができた.よく勉強しなさい.
配列と構造体はメモリの中で実は同じで、彼らはすべて連続的に分布していると言ったのを覚えています.例:
TMyStruct = record
A,B,C:Integer;
end;
T3IntArray = array[0..2]of Integer;
どちらも12バイトでTMyStruct.AはT 3 Intarray[0].配列内のある要素にアクセスするとき、最初の要素のアドレス+シーケンス番号*要素のサイズだけであることがわかります.アクセス構造体もそうであるべきであるが、構造体の各要素の大きさは必ずしも同じではなく、配列の各要素は同じである.では、セグメントコードを見てみましょう.
type
TMyStruct = record
A,B,C:Integer;
end;
T3IntArray = array[0..2]of Integer;
PMyStruct = ^TMyStruct;
procedure TForm2.Button2Click(Sender: TObject);
var
aArray:array[0..99] of Byte;
P:PMyStruct;
I: Integer;
begin
P:=PMyStruct(@aArray[0]);
for I := 0 to 5 - 1 do
begin
P^.A:=55;
P^.B:=66;
P^.C:=77;
Inc(P);
end;
end;
実はこのPはTMyStructの配列を定義することに相当して、5つの要素がありますが、私たちはポインタを定義して、しかも空間を割り当てていません.私はaArrayの空間の上で使用しています.つまりプロセス終了時にaArray空間が回収されるとPは消滅する.逆アセンブリコードを見てください.
utMain.pas.143: P:=PMyStruct(@aArray[0]);
004B6ACB 8BC4 mov eax,esp
utMain.pas.144: for I := 0 to 5 - 1 do
004B6ACD BA05000000 mov edx,$00000005 //
utMain.pas.146: P^.A:=55;
004B6AD2 C70037000000 mov [eax],$00000037 // A 55
utMain.pas.147: P^.B:=66;
004B6AD8 C7400442000000 mov [eax+$04],$00000042 // B 66
utMain.pas.148: P^.C:=77;
004B6ADF C740084D000000 mov [eax+$08],$0000004d // C
utMain.pas.149: Inc(P);
004B6AE6 83C00C add eax,$0c // , TMyStruct 3*4=12=$0c
utMain.pas.144: for I := 0 to 5 - 1 do
004B6AE9 4A dec edx
004B6AEA 75E6 jnz $004b6ad2
構造体のある要素の値にアクセスして修正することも、構造体ポインタの上でオフセットことが明らかになった.はい、次は列挙を見てみましょう.休みです.家で米に網ができた.よく勉強しなさい.