Delphi-配列と構造体

1654 ワード

技術交流、DH解説.
配列と構造体はメモリの中で実は同じで、彼らはすべて連続的に分布していると言ったのを覚えています.例:
    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

構造体のある要素の値にアクセスして修正することも、構造体ポインタの上でオフセットことが明らかになった.はい、次は列挙を見てみましょう.休みです.家で米に網ができた.よく勉強しなさい.