• pragma pack,字节对齐


    关于字节对齐

    pragma pack

    一、

    测试代码:

    // packTest.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include <iostream>
    
    using namespace std;
    
    /************************************************************************/
    /*    Defualt                                                           */
    /************************************************************************/
    class A0
    {
    	char a;
    	int b;
    	double c;
    	bool d;
    	short e;	
    };
    class A1
    {
    	char a;
    	int b;
    	double c;
    	bool d;
    };
    class A2
    {
    	char a;
    	int b;
    	double c;
    };
    class A3
    {
    	char a;
    	int b;
    };
    class A
    {
    	char a;
    	int b;
    	double c;
    	bool d;
    	short e;
    	char f;
    };
    /*
    事实上,很多人对#pragma pack的理解是错误的。
    #pragma pack规定的对齐长度,实际使用的规则是:
    结构,联合,或者类的数据成员,第一个放在偏移为0的地方,以后每个数据成员的对齐,
    按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
    也就是说,当#pragma pack的值等于或超过所有数据成员长度的时候,这个值的大小将不产生任何效果。
    而结构整体的对齐,则按照结构体中最大的数据成员 和 #pragma pack指定值 之间,较小的那个进行。
    */
    
    /************************************************************************/
    /*                                                                      */
    /************************************************************************/
    #pragma  pack(push)
    #pragma  pack(1)
    class B
    {
    	char a;
    	int b;
    	double c;
    	bool d;
    	short e;
    	char f;
    };
    #pragma  pack(pop)
    
    /************************************************************************/
    /*                                                                      */
    /************************************************************************/
    #pragma  pack(push)
    #pragma  pack(2)
    class BB
    {
    	char a;
    	int b;
    	double c;
    	bool d;
    	short e;
    	char f;
    };
    #pragma  pack(pop)
    
    
    /************************************************************************/
    /*                                                                      */
    /************************************************************************/
    #pragma  pack(push)
    #pragma  pack(4)
    class C
    {
    	char a;
    	int b;
    	double c;
    	bool d;
    	short e;
    	char f;
    };
    #pragma  pack(pop)
    
    
    /************************************************************************/
    /*                                                                      */
    /************************************************************************/
    #pragma  pack(push)
    #pragma  pack(8)
    class D
    {
    	char a;
    	int b;
    	double c;
    	bool d;
    	short e;
    	char f;
    };
    #pragma  pack(pop)
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	cout<<"char : "<<sizeof(char)<<" byte 
    ";
    	cout<<"int : "<<sizeof(int)<<" byte 
    ";
    	cout<<"double : "<<sizeof(double)<<" byte 
    ";
    	cout<<"bool : "<<sizeof(bool)<<" byte 
    ";
    	cout<<"short : "<<sizeof(short)<<" byte 
    ";
    	cout<<"/*---------------------------------------------*/"<<"
    ";
    	cout<<"Default aligned A3:"<<sizeof(A3)<<"
    ";
    	cout<<"Default aligned A2:"<<sizeof(A2)<<"
    ";
    	cout<<"Default aligned A1:"<<sizeof(A1)<<"
    ";
    	cout<<"Default aligned A0:"<<sizeof(A0)<<"
    ";
    	cout<<"Default aligned A:"<<sizeof(A)<<"
    ";
    	cout<<"1 aligned:"<<sizeof(B)<<"
    ";
    	cout<<"2 aligned:"<<sizeof(BB)<<"
    ";
    	cout<<"4 aligned:"<<sizeof(C)<<"
    ";
    	cout<<"8 aligned:"<<sizeof(D)<<"
    ";
    	return 0;
    }
    

    二、测试结果


    三 、各类说明分析

    /************************************************************************/
    /*    Defualt                                                           */
    /************************************************************************/
    class A0
    {
    	/*
    	* 默认为 8 字节对齐
    	*/
    	char a;
    	int b;
    	double c;
    	bool d;
    	short e;
    };
    class A1
    {
    	char a;
    	int b;
    	double c;
    	bool d;
    };
    class A2
    {
    	char a;
    	int b;
    	double c;
    };
    class A3
    {
    	char a;
    	int b;
    };
    class A
    {
    	char a;
    	int b;
    	double c;
    	bool d;
    	short e;
    	char f;
    };


    /************************************************************************/
    /*                                                                      */
    /************************************************************************/
    #pragma  pack(push)
    #pragma  pack(1)
    class B
    {
    	char a;
    	int b;
    	double c;
    	bool d;
    	short e;
    	char f;
    };
    #pragma  pack(pop)



    /************************************************************************/
    /*                                                                      */
    /************************************************************************/
    #pragma  pack(push)
    #pragma  pack(2)
    class BB
    {
    	char a;
    	int b;
    	double c;
    	bool d;
    	short e;
    	char f;
    };
    #pragma  pack(pop)



    /************************************************************************/
    /*                                                                      */
    /************************************************************************/
    #pragma  pack(push)
    #pragma  pack(4)
    class C
    {
    	char a;
    	int b;
    	double c;
    	bool d;
    	short e;
    	char f;
    };
    #pragma  pack(pop)




    /************************************************************************/
    /*                                                                      */
    /************************************************************************/
    #pragma  pack(push)
    #pragma  pack(8)
    class D
    {
    	char a;
    	int b;
    	double c;
    	bool d;
    	short e;
    	char f;
    };
    #pragma  pack(pop)



    参考:http://msdn.microsoft.com/zh-cn/library/2e70t5y1(v=vs.90).aspx


    ***************************************************************************

    Specifies the value, in bytes, to be used for packing. The default value for n is 8. Valid values are 1, 2, 4, 8, and 16. The alignment of a member will be on a boundary that is either a multiple of n or a multiple of the size of the member, whichever is smaller.




    源码下载地址:http://download.csdn.net/detail/cartzhang/6792147 

    本博客源码链接地址

    ----------------------------------

    若有 问题,请不吝赐教。

    非常感谢!



  • 相关阅读:
    最详细易懂的CRC-16校验原理(附源程序)
    咳嗽秘方
    三十年前三十年后
    车载导航系统中常用物理量和单位
    mssql 中文乱码 字库集 问题解决方法
    CuteEditor.Editor+a+a+c+a+a.a() System.RuntimeType.get_Assembly() 问题解决方法
    .NET Framework 4.5 五个很棒的特性
    很管用的治咳嗽秘方
    python 使用pip install 手动安装本地包的方法
    Facebook支持python的开源预测工具Prophet
  • 原文地址:https://www.cnblogs.com/qitian1/p/6461988.html
Copyright © 2020-2023  润新知