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