CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

#pragma pack()是做什么用的啊?在线等。。。

楼主wwwhb2000(Good good study, Day day Up!)2004-08-04 13:49:26 在 VC/MFC / 基础类 提问

#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

相关问题

  • pragma pack 问题
  • 关于:#pragma pack(1)
  • 关于pragma pack的问题.
  • #pragma pack(<[push &brvbar; pop],[identifier]>,[n]) 的用处是什么,什么地方用?
  • #pragma有何作用
  • 请问#pragma pack是什么意思?
  • #pragma pack(1)是做什么的?
  • (急问)有关#pragma pack()的问题
  • 请问#pragma的作用
  • #pragma once什么作用?

关键词

  • 结构
  • pragma packing
  • zp
  • packing
  • dword reg
  • 结构体内
  • cl
  • registers
  • struct
  • push

得分解答快速导航

  • 帖主:wwwhb2000
  • kvls
  • aspnetwuxueyou

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo