Packed Record ( 积分: 3 )

  • 主题发起人 主题发起人 yanmin11003
  • 开始时间 开始时间
Y

yanmin11003

Unregistered / Unconfirmed
GUEST, unregistred user!
1. Packed Record是什么类型
2. cdecl; external '*.dll'是什么意思
 
1.是紧缩记录类型
2.调用规则;外部函数声明'*.dll'说明这个函数在*.dll中
 
cdecl: C语言压堆栈方式!
 
是在DELPHI中.Packed Record和Record有什么区别
 
紧缩记录类型
 
接受答案了.
 
Packed Record和Record有什么区别
区别在于:主要是编译器为了生成让CPU更高效率运行的代码,编译器会调整定义结构中域对齐边界(当前32位CPU的对齐边界就是32位 也就是4字节)。
例如:
TTestRec=record
a:char; //4 byte
b:DWORD; //4 byte
end;
它将占用8个字节,也就是a不是一个字节,为了CPU快速定位,编译器直接将它扩展为4个字节了。这种扩展有些时候是很好的,毕竟效率高了不少,但有时候我们并不需要这种扩展,所以这个时候我们采用packed record方式定义,它严格按照你实际需要的大小来定义并操作结构的。
TTestRec=packed record
a:char; //1 byte
b:DWORD; //4 byte
end;
这个结构只有5字节了。在C编译器中也存在类似问题,我们使用 #pragma pack(1)来完成类似的严格约束。
cdecl调用规范是从左到右顺序压栈,调用者负责退栈。
stdcall调用规范是从左到右顺序压栈,函数自身负责退栈。
还有一种就是VC++和Delphi使用的调用规范,VC的类似cdecl,只是把this指针放入EAX中,而Delphi直接使用EDX,ECX传递参数,不够的使用压栈方式,Self指针也放在EAX中。
如果是开发DLL,导出函数要给多种语言调用,那就不能使用编译器自身的一些调用规范,而应该使用标准调用规范:stdcall。
就讲这么多了^_^
 
慢了慢了,连3分都没有得到^_^
 
后退
顶部