zoukankan      html  css  js  c++  java
  • C++编译指令#pragma pack的配对使用

    #pragma pack可以用来指定C++数据结构的成员变量的内存对齐数值(可选值为1,2,4,8,16)。

    本文主要是强调在你的头文件中使用pack指令要配对使用,以避免意外影响项目中其他源文件的结构成员的内存对齐。

    如果影响了其他源文件的结构成员内存对齐,那么在你按照默认对齐来计算那些结构成员占用内存大小

    或者使用指针移动计算结构成员偏移位置的时候,就可能会出现意料之外的异常。

    主要可能的异常是内存定位错误或非法内存访问,结果可能导致错误的定位或数值,极端的情况下可能导致程序崩溃。

    下面的例子用来展示基本的配对使用方式。

    1)#pragma pack(n)的配对使用

     

     //filename: header1.h
    
      #pragma pack(1) //内存对齐设置为1个字节
      struct s1   {     int i;     char c;     bool f;   } //struct s2{...}   //...   #pragma pack() //恢复默认的内存对齐(与文件开头的指令配对使用

    2)#pragma pack(push|pop,n)的配对使用

      //filename: header2.h
    
      #pragma pack(push,1) //内存对齐设置为1个字节
    
      struct s3
      {
        int i;
        char c;
        bool f;
      }
    
        //struct s4{...}
    
       //...
    
      #pragma pack(pop)   //恢复默认的内存对齐(与文件开头的指令配对使用)

    MSDN上VC++2013的帮助文档关于pack指令的用法说明如下,供参考。

    -------------------- 以下摘自MSDN ----------------------------

    #pragma pack( [ n)

    Specifies packing alignment for structure and union members. Whereas the packing alignment of structures and unions is set for an entire translation unit by the /Zp option, the packing alignment is set at the data-declaration level by the pack pragma. The pragma takes effect at the first structure or union declaration after the pragma is seen; the pragma has no effect on definitions.

    When you use #pragma pack(n), where n is 1, 2, 4, 8, or 16, each structure member after the first is stored on the smaller member type or n-byte boundaries. If you use#pragma pack without an argument, structure members are packed to the value specified by /Zp. The default /Zp packing size is /Zp8.

    The compiler also supports the following enhanced syntax:

    #pragma pack( [ [ { push | pop}, ] [  identifier, ] ] [ n ] )

    This syntax allows you to combine program components into a single translation unit if the different components use pack pragmas to specify different packing alignments.

    Each occurrence of a pack pragma with a push argument stores the current packing alignment on an internal compiler stack. The pragma’s argument list is read from left to right. If you use push, the current packing value is stored. If you provide a value for n, that value becomes the new packing value. If you specify an identifier, a name of your choosing, the identifier is associated with the new packing value.

    Each occurrence of a pack pragma with a pop argument retrieves the value at the top of an internal compiler stack and makes that value the new packing alignment. If you use pop and the internal compiler stack is empty, the alignment value is that set from the command-line and a warning is issued. If you use pop and specify a value for n, that value becomes the new packing value. If you use pop and specify an identifier, all values stored on the stack are removed from the stack until a matchingidentifier is found. The packing value associated with the identifier is also removed from the stack and the packing value that existed just before the identifier was pushed becomes the new packing value. If no matching identifier is found, the packing value set from the command line is used and a level-one warning is issued. The default packing alignment is 8.

  • 相关阅读:
    NOIP 2011 提高组 计算系数(vijos 1739)(方法:二项式定理)
    NOIP 2012 提高组 借教室(vijos 1782) 总览
    NOIP 2012 提高组 借教室(vijos 1782) 线段树85分打法
    NOIP 2011 提高组 铺地毯(vijos 1736)(方法:纯枚举)
    获取指定时间的前一天、后一天及当前时间的前一周、前一个月
    input file禁用手机本地文件选择,只允许拍照上传图片
    给定一个时间,获取该时间所在周的周一及周日
    Fiddler手机抓包软件简单使用将h5效果显示在手机
    解决Linux服务器更换IP后,ssh连接被拒绝问题
    解决Hadoop启动报错:File /opt/hadoop/tmp/mapred/system/jobtracker.info could only be replicated to 0 nodes, instead of 1
  • 原文地址:https://www.cnblogs.com/Andrewz/p/4128038.html
Copyright © 2011-2022 走看看