Packed Record

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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值