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 出栈,并将对其方式设置为出栈的对齐方

  • 相关阅读:
    poj 3378 Crazy Thairs 夜
    1487. Chinese Football 夜
    容斥原理
    Dancing Links
    三角剖分
    模线性方程模板
    模线性方程
    容斥原理 POJ2773
    DNA Sequence [矩阵]
    hdu 2588 容斥
  • 原文地址:https://www.cnblogs.com/gexin/p/7472933.html
Copyright © 2011-2022 走看看