#pragma pack()是做什么用的啊?在线等。。。
#pragma pack(push,1)
typedef struct _DIOC_REGISTERS {
DWORD reg_EBX;
DWORD reg_EDX;
DWORD reg_ECX;
DWORD reg_EAX;
DWORD reg_EDI;
DWORD reg_ESI;
DWORD reg_Flags;
} DIOC_REGISTERS, *PDIOC_REGISTERS;
#pragma pack(pop)
#pragma pack()是做什么用的啊?
问题点数:20、回复次数:7Top
1 楼kvls(冰茶)回复于 2004-08-04 13:56:31 得分 10
指定结构使用的对齐字节Top
2 楼wwwhb2000(Good good study, Day day Up!)回复于 2004-08-04 13:58:35 得分 0
冰茶,你好!能说的再清楚一点吗?我查了MSDN,但是没看懂!Top
3 楼aspnetwuxueyou(SHIP IT)回复于 2004-08-04 14:26:52 得分 10
就是指定结构体内成员占几个字节。
#pragma pack(push,1)可以使编译器不在struct内留空位。
使用CL的/Zp开关,例如:CL /Zp8 指定结构体内以8个字节为单位包装结构体内的数据。
例子:
CL /Zp8
#include <iostream>
using namespace std;
struct // packing is 8
{
int a;
char b;
} sa;
#pragma pack(push,1) // packing is now 1
struct
{
int a;
char b;
double c;
} sb;
#pragma pack(pop) // packing is 8
struct
{
int a;
double c;
char b;
} sc;
int main(void)
{
cout << "sizeof(sa) =" << sizeof(sa) << endl;
cout << "sizeof(sb) =" << sizeof(sb) << endl;
cout << "sizeof(sc) =" << sizeof(sc) << endl;
return 0;
}
输出结果:sizeof(sa)=8,sizeof(sb)=13,sizeof(sc)=24
Top
4 楼kvls(冰茶)回复于 2004-08-04 14:29:36 得分 0
通常情况下会发生以下两种情况会使用pragma pack:
1、在网络传输中需要精确计算传输的结构字节数,那么就不允许编译器自动进行数据的对齐。因为一旦使用某个标准进行对齐的话会增加结构字节数,所以就使用#pragma pack(1)来强制1字节对齐。
2、在用VC写DLL,由其他语言如Delphi来调用,那么就涉及到结构大小的问题,因为不同语言默认的对齐方式不一样,要在两种语言间传递结构就要对齐方式一样。(说的不太准确)
解释一下你程序里的意思,刚好中午休息有点时间。
1、#pragma pack(push,1) 将当前的对齐方式(比如8)压入堆栈(编译器的堆栈),并将这个对齐方式取名为1
2、然后是你的程序 在这儿可以定义你的结构联合等,并且可以使用专用的对齐方式。
3、#pragma pack(pop) 将堆栈中的对齐方式出栈
一点说明:使用#pragma pack(push..pop)这对语句的目的就在于保存、恢复对齐方式,这样使你在这对语句间可以随便使用其他的对齐方式,并能保证你的语句前后的对齐方式不变。
1、因为你在这里的结构定义没有改变对齐方式,所以没有多大的必要使用pragma
2、在压栈时使用了1这个名称,在出栈时最好也要加上名称#pragma pack(pop, 1),这样才能准确的保持一致
PS:写的好像多了点
Top
5 楼aspnetwuxueyou(SHIP IT)回复于 2004-08-04 14:30:49 得分 0
还有一点必须指出:由#pragma pack(n)设定packing后,编译器实际排列结构体内部成员的时候,并不一定是按照#pragma pack(n)中的n指定长度为单位的,还取决于结构体内部占用空间最大的类型的长度。这么做可能是为了节省空间。例如:
struct // packing is 8
{
int a;
char b;
} sa;
在排列成员int a和char b的时候是以4个字节为单位的。因为此时sizeof(int)=4<8,所以排列的时候以4为单位。但是当packing值小于4的时候则以packing值为单位排列。所以:
struct // packing is 8
{
int a;
int c;
char b;
} sa;
输出结果为:sizeof(sa)=12;(以4个字节为单位)
当packing值小于结构体内占用空间最多成员占用的字节数的时候,以packing值为准。
#pragma pack(push,1) // packing is now 1
struct
{
int a;
char b;
double c;
} sb;
输出结果为:sizeof(sb)=13;(以1个字节为单位)
Top
6 楼jazy()回复于 2004-08-04 14:31:34 得分 0
不用push1指定一字节对齐的数据结构,编译器会在结构里面偷偷加上几个位置,
但你是不知道的,用结构的时候容易读写错位Top
7 楼kvls(冰茶)回复于 2004-08-04 14:39:22 得分 0
呵呵,不好意思,刚看了上面的一篇恢复才反应过来有个地方我给你说错了
在上面说的1不是名称,你的程序里没有名称。。。呵呵,难得脸红Top




