谈delphi记录类型与vc中的结构转换 ( 积分: 11 )

  • 主题发起人 ddzhouqian
  • 开始时间
D

ddzhouqian

Unregistered / Unconfirmed
GUEST, unregistred user!
//delphi
procedure TForm1.Button1Click(Sender: TObject)

type TRecord1=record
a1:byte

d1:Cardinal

end

type TRecord2=packed record
a1:byte

d1:Cardinal

end

begin
showmessage(IntToStr(SizeOf(TRecord1)));//输出值为8
showmessage(IntToStr(SizeOf(TRecord2)));//输出值为5
end

//vc
typedef struct tagTStruct1
{
unsigned char a1

unsigned int d1


}TStruct1,*LStruct1

void Cdialog1::OnBnClickedOk()
{
int value=0

char value1[100]

CString value2

value2=""

itoa(sizeof(TStruct1),value1,10)

value2.Format("struct is %s",value1)

AfxMessageBox(value2)
//输出值为8
}
以上代码均调试过了,想请问vc中为什么取出的占用大小也是8啊,这样起不是很占用资源吗?(对比与delphi packed record类型),本人对vc不太了解,也没用过,只是最近需要看些代码,才弄了下,只是本着相互学习的态度,请大家场所语言,分不够我会加的
 
编译器优化的结果,大小为8比起大小为5来CPU处理的速度更快。
 
基本能够接受,可否在深入谈谈?
 
在VC中的struct 定义的结构与delphi中的record一样的,编译器都会按照CPU的字长来优化结构,使得CPU读取结构中的域速度最快。这个时候CHAR会扩展为DWORD。如果要紧缩形式的结构,VC采用编译选项#pragma pack(1) ...#pragma pack()中来定义结构,delphi采用packed record关键字来定义。
 
非常感谢晶晶,开始我以为vc里没有你所说的"紧缩形式的结构(pack)",
现在算是刚刚明白,我还想问下:
如果我将该结构改成紧缩形式的结构(也就是packed),那么编译的时候速度是不是会加快啊?
 
访问的时候速度显然就没有那么快了。你看看386之后的汇编寻址方式就明白了,有个比例寻址方式是内部支持的,这对于那些域对齐的结构访问是非常快的。而对于那些紧缩形的结构,为了准确定位结构中的域,编译器有时候要生成多余的运算代码来定位域的位置。所以你说反了,紧缩形的更慢(不管是CPU执行还是编译器编译都是更慢)才对。
 

Similar threads

顶部