zoukankan      html  css  js  c++  java
  • #pragma pack(n)对齐格式

    #pragma pack(n)对齐格式

    #pragma pack(n) 是预处理器用来指定对齐格式的指令,表示n对齐。当元素字节小于n时,要扩展到n;若元素字节大于n则占用其实际大小。

    struct tmp{
    	int a;
    	char b;
    	int c;
    };
    
    int main()
    {	
    	struct tmp temp;
    
    	printf("a:0x%x
    ",&(temp.a));
    	printf("b:0x%x
    ",&(temp.b));
    	printf("c:0x%x
    ",&(temp.c));
    	printf("size of temp is %d
    ",sizeof(struct tmp));
    
    	return 0;
    }
    

    对于tmp结构体,32位系统中默认情况下按照4字节对齐,该结构体占用12个字节,上面函数的输出如下:

    a:0x28ff34
    b:0x28ff38
    c:0x28ff3c
    size of temp is 12
    

    当在结构体定义前加上#pragma pack(1)后,表示1字节对齐,也就是char类型数据不会扩展,该结构体占用9个字节,上述函数输出如下:

    #pragma pack(1)
    struct tmp{
    	int a;
    	char b;
    	int c;
    };
    
    ///////////输出如下////////////
    
    a:0x28ff37
    b:0x28ff3b
    c:0x28ff3c
    size of temp is 9
    

    使用指令#pragma pack ()编译器将取消自定义的字节对齐方式,恢复到默认对齐方式,下面例子中,tmp将占用9个字节,而tmp1占用12个字节。

    #pragma pack(1)
    struct tmp{
    	int a;
    	char b;
    	int c;
    };
    
    #pragma pack()
    
    struct tmp1{
    	int a;
    	char b;
    	int c;
    };
    

    另外,注意别的#pragma pack 的其他用法:
    #pragma pack(push) //保存当前对其方式到packing stack
    #pragma pack(push,n) 等效于
    #pragma pack(push)
    #pragma pack(n) //n=1,2,4,8,16 保存当前对齐方式,设置按n 字节对齐
    #pragma pack(pop) //packing stack 出栈,并将对其方式设置为出栈的对齐方

  • 相关阅读:
    STM32 串口DMA方式接收(转)
    STM32 串口功能 库函数 详解和DMA 串口高级运用(转载)
    内存泄露调试心得
    Android 5.0 5.1 webview 闪退问题
    ios 接入微信开发 新版
    ios 获取app版本号
    ios alamofire4.x网络框架url 中文问题
    微服务监控druid sql
    kotlin 单例模式
    mysql 数据库保存 微信分享时不能换行
  • 原文地址:https://www.cnblogs.com/gexin/p/7472933.html
Copyright © 2011-2022 走看看