pragma pack用法

#include <iostream>
#include <stdlib.h>
#include <memory.h>
#include <vector>

using namespace std;
#include <string>
#include <iostream>
#pragma pack(push)
#pragma pack(1)
typedef  struct YOUR
{  
 int   sd   :2;
  char   cTsd[2];   
 int   ss   :7;

}_YOUR;


int main( )
{

   // The first member function
   // searches for a single character in a string

 cout<<sizeof(_YOUR)<<endl;
 return 0;
}

 

 

作用:

主要用来设置结构定义的字节对齐方式,比如是单字节对齐,双字节对齐等,比如如果是双字节对齐,那么结构的成员变量的地址必须是2的整数倍,这就造成了字节补齐,但是提高了访问速度。单字节呢,就是没有补齐,成员变量的地址是连续的,其他依次类推,通常是4,8等。通常用于网络传输数据,特别是传输整个结构时,必须采取单字节对齐,这样才可以直接把结构地址,以及结构长度,作为Send的参数发送整个结构,否则只能依次发送结构的成员,要不然会出现结构解释的差异。  

 

 

通常情况下网络传输没有设置pack是因为默认都是pack(4),只要Recv端定义的结构和Send方一样就没问题了。  
  pack多用于Hook程序,比如Hook   Api技术,因为需要硬编码,所以必须将结构  
  压缩,将内容补齐!  
  比如:  
  ASM_STRUCT{  
      BYTE   bJmp;  
      DWORD   dwDes;  
  }a;  
  如果不用Pack时,编译为:  
    a.bJmp   =   0xEB;   //   jmp的编码  
    a.dwDes   =   0x00410123;   //   jmp   0x00410123  
  不用pack的话,内存内容为     0xEB   XX   XX   XX   23   01   41   00   //   共8BYTE  
  其中XX为不定值,用pack后     0xEB   23   01   41   00   //   共5BYTE  
  这样,在Hook时运行这些指令,就必须用#parama   pack(1)   //   1   BYTE方式对齐。  

你可能感兴趣的:(pragma pack用法)