zoukankan      html  css  js  c++  java
  • 谨慎使用#pragma pack

    前段时间将一个项目由vc6.0转为vs2005,发现了有些对象的地址奇怪变化的问题,细查之下发现出现了#pragma pack乱用的问题,在恢复内存对齐使用了#pragma pack(pop, 1)的错误,估计程序设计者最初没有注意到这个问题,不过很奇怪的是vc6.0却没有出现这个问题,总结一下#pragma pack使用的规范,避免以后乱用。

    #pragma pack作用:指定结构体、联合以及类成员的packing alignment;

    语法:#pragma pack( [show] | [push | pop] [, identifier], n )

    说明:

    1,     pack提供数据声明级别的控制,对定义不起作用;

    2,     调用pack时不指定参数,n将被设成默认值;

    3,     一旦改变数据类型的alignment,直接效果就是占用memory的减少,但是performance会下降;

    语法具体分析:

    1,     show:可选参数;显示当前packing aligment的字节数,以warning message的形式被显示;

    2,     push:可选参数;将当前指定的packing alignment数值进行压栈操作,这里的栈是the internal compiler stack,同时设置当前的packing alignment为n;如果n没有指定,则将当前的packing alignment数值压栈;

    3,     pop:可选参数;从internal compiler stack中删除最顶端的record;如果没有指定n,则当前栈顶record即为新的packing alignment数值;如果指定了n,则n将成为新的packing aligment数值;如果指定了identifier,则internal compiler stack中的record都将被pop直到identifier被找到,然后pop出identitier,同时设置packing alignment数值为当前栈顶的record;如果指定的identifier并不存在于internal compiler stack,则pop操作被忽略;

    4,     identifier:可选参数;当同push一起使用时,赋予当前被压入栈中的record一个名称;当同pop一起使用时,从internal compiler stack中pop出所有的record直到identifier被pop出,如果identifier没有被找到,则忽略pop操作;

    5,     n:可选参数;指定packing的数值,以字节为单位;缺省数值是8,合法的数值分别是1、2、4、8、16。

     

    一般比较适合的语法是

    方法一:

    #pragma pack(push, 4)//修改内存对齐为4字节

    //代码

    #pragma pack(pop)

    方法二:

    #pragma pack(push)

    #pragma pack(4)//修改内存对齐为4字节

    //代码

    #pragma pack(pop)

    当然,只要按照#pragma pack的语法要求正确的使用都是没有问题的,但使用的时候一定要注意安全

  • 相关阅读:
    sqlserver 获取系统用户表结构信息
    Android访问WebService的两种方法
    C# WebService的简单和复杂参数类型和结果的JSON格式
    JQuery的Ajax使用Get,Post方法调用C#WebService并返回数据
    jQuery提交Json数据到Webservice,并接收返回的Json数据
    C#开发的WebService使用JSON格式传递数据+Ajax测试
    Web项目的三层架构和MVC架构异同
    SqlServer更新视图存储过程函数脚本
    SqlServer刷新所有视图
    SqlServer获取表结构语句
  • 原文地址:https://www.cnblogs.com/ark-zhang/p/3247301.html
Copyright © 2011-2022 走看看