type
MyRec=Record
var1:integer;
var2,var3,var4,var5,var6,var7,var8:shortint;
var9:integer;
var10:shortint;
var11:integer;
var12,var13:shortint;
end;
type
MyPackedRec=Packed Record
var1:integer;
var2,var3,var4,var5,var6,var7,var8:shortint;
var9:integer;
var10:shortint;
var11:integer;
var12,var13:shortint;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
rc:MyRec;
BaseAddr:Integer;
begin
ListBox1.Items.Add(intTostr(SizeOf(rc)));
BaseAddr:=Integer(@rc);
ListBox1.Items.Add(format('@rc:%x',[BaseAddr]));
ListBox1.Items.Add(format('@rc.var1:%x',[Integer(@rc.var1)-BaseAddr]));
with ListBox1.Items do
begin
Add(format('@rc.var2:%x',[Integer(@rc.var2)-BaseAddr]));
Add(format('@rc.var3:%x',[Integer(@rc.var3)-BaseAddr]));
Add(format('@rc.var4:%x',[Integer(@rc.var4)-BaseAddr]));
Add(format('@rc.var5:%x',[Integer(@rc.var5)-BaseAddr]));
Add(format('@rc.var6:%x',[Integer(@rc.var6)-BaseAddr]));
Add(format('@rc.var7:%x',[Integer(@rc.var7)-BaseAddr]));
Add(format('@rc.var8:%x',[Integer(@rc.var8)-BaseAddr]));
Add(format('@rc.var9:%x',[Integer(@rc.var9)-BaseAddr]));
Add(format('@rc.var10:%x',[Integer(@rc.var10)-BaseAddr]));
Add(format('@rc.var11:%x',[Integer(@rc.var11)-BaseAddr]));
Add(format('@rc.var12:%x',[Integer(@rc.var12)-BaseAddr]));
Add(format('@rc.var13:%x',[Integer(@rc.var13)-BaseAddr]));
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
rc:MyPackedRec;
BaseAddr:Integer;
begin
ListBox2.Items.Add(intTostr(SizeOf(rc)));
BaseAddr:=Integer(@rc);
ListBox2.Items.Add(format('@rc:%x',[BaseAddr]));
ListBox2.Items.Add(format('@rc.var1:%x',[Integer(@rc.var1)-BaseAddr]));
with ListBox2.Items do
begin
Add(format('@rc.var2:%x',[Integer(@rc.var2)-BaseAddr]));
Add(format('@rc.var3:%x',[Integer(@rc.var3)-BaseAddr]));
Add(format('@rc.var4:%x',[Integer(@rc.var4)-BaseAddr]));
Add(format('@rc.var5:%x',[Integer(@rc.var5)-BaseAddr]));
Add(format('@rc.var6:%x',[Integer(@rc.var6)-BaseAddr]));
Add(format('@rc.var7:%x',[Integer(@rc.var7)-BaseAddr]));
Add(format('@rc.var8:%x',[Integer(@rc.var8)-BaseAddr]));
Add(format('@rc.var9:%x',[Integer(@rc.var9)-BaseAddr]));
Add(format('@rc.var10:%x',[Integer(@rc.var10)-BaseAddr]));
Add(format('@rc.var11:%x',[Integer(@rc.var11)-BaseAddr]));
Add(format('@rc.var12:%x',[Integer(@rc.var12)-BaseAddr]));
Add(format('@rc.var13:%x',[Integer(@rc.var13)-BaseAddr]));
end;
end;
end.
// PackedRec.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
struct rec
{
int var1;
char var2,var3,var4,var5,var6,var7,var8;
int var9;
char var10;
int var11;
char var12,var13;
};
#pragma pack(push) //保存对齐状态
#pragma pack(1)//设定字节对齐
struct recPack
{
int var1;
char var2,var3,var4,var5,var6,var7,var8;
int var9;
char var10;
int var11;
char var12,var13;
};
#pragma pack(pop)//恢复对齐状态
int main(int argc, char* argv[])
{
rec rc;
printf("%d\n",sizeof(rc));
int baseAddr=(int)&rc;
printf("baseAddr=%x\n",baseAddr);
printf("offset var1=%x\n",(int)&rc.var1-baseAddr);
printf("offset var2=%x\n",(int)&rc.var2-baseAddr);
printf("offset var3=%x\n",(int)&rc.var3-baseAddr);
printf("offset var4=%x\n",(int)&rc.var4-baseAddr);
printf("offset var5=%x\n",(int)&rc.var5-baseAddr);
printf("offset var6=%x\n",(int)&rc.var6-baseAddr);
printf("offset var7=%x\n",(int)&rc.var7-baseAddr);
printf("offset var8=%x\n",(int)&rc.var8-baseAddr);
printf("offset var9=%x\n",(int)&rc.var9-baseAddr);
printf("offset var10=%x\n",(int)&rc.var10-baseAddr);
printf("offset var11=%x\n",(int)&rc.var11-baseAddr);
printf("offset var12=%x\n",(int)&rc.var12-baseAddr);
printf("offset var13=%x\n",(int)&rc.var13-baseAddr);
{
recPack rc;
printf("%d\n",sizeof(rc));
int baseAddr=(int)&rc;
printf("baseAddr=%x\n",baseAddr);
printf("offset var1=%x\n",(int)&rc.var1-baseAddr);
printf("offset var2=%x\n",(int)&rc.var2-baseAddr);
printf("offset var3=%x\n",(int)&rc.var3-baseAddr);
printf("offset var4=%x\n",(int)&rc.var4-baseAddr);
printf("offset var5=%x\n",(int)&rc.var5-baseAddr);
printf("offset var6=%x\n",(int)&rc.var6-baseAddr);
printf("offset var7=%x\n",(int)&rc.var7-baseAddr);
printf("offset var8=%x\n",(int)&rc.var8-baseAddr);
printf("offset var9=%x\n",(int)&rc.var9-baseAddr);
printf("offset var10=%x\n",(int)&rc.var10-baseAddr);
printf("offset var11=%x\n",(int)&rc.var11-baseAddr);
printf("offset var12=%x\n",(int)&rc.var12-baseAddr);
printf("offset var13=%x\n",(int)&rc.var13-baseAddr);
}
return 0;
}