关于字节对齐
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 \n";
cout<<"int : "<<sizeof(int)<<" byte \n";
cout<<"double : "<<sizeof(double)<<" byte \n";
cout<<"bool : "<<sizeof(bool)<<" byte \n";
cout<<"short : "<<sizeof(short)<<" byte \n";
cout<<"/*---------------------------------------------*/"<<"\n";
cout<<"Default aligned A3:"<<sizeof(A3)<<"\n";
cout<<"Default aligned A2:"<<sizeof(A2)<<"\n";
cout<<"Default aligned A1:"<<sizeof(A1)<<"\n";
cout<<"Default aligned A0:"<<sizeof(A0)<<"\n";
cout<<"Default aligned A:"<<sizeof(A)<<"\n";
cout<<"1 aligned:"<<sizeof(B)<<"\n";
cout<<"2 aligned:"<<sizeof(BB)<<"\n";
cout<<"4 aligned:"<<sizeof(C)<<"\n";
cout<<"8 aligned:"<<sizeof(D)<<"\n";
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

本博客源码链接地址

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

若有 问题,请不吝赐教。

非常感谢!

pragma pack,字节对齐的更多相关文章

  1. #pragma pack(n)对齐格式

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

  2. 关于结构体内存对齐方式的总结(#pragma pack()和alignas())

    最近闲来无事,翻阅msdn,在预编译指令中,翻阅到#pragma pack这个预处理指令,这个预处理指令为结构体内存对齐指令,偶然发现还有另外的内存对齐指令aligns(C++11),__declsp ...

  3. #pragma pack(x) CPU对齐

    编译器会尽量把成员对齐以提高内存的命中率.对齐是可以更改的,使用"#pragma pack(x)" 可以改变编译器的对齐方式. C++固有类型的对界取编译器对齐方式与自身大小中较小 ...

  4. #pragma pack的使用

    #pragma pack的作用 程序编译器对变量的存储带有一定随机性,而pragma pack是一种字节对齐方法,采用人为设定的方式将存储数据按一定格式排布.百科中提到了其一种作用:有的平台每次读都是 ...

  5. #pragma pack(push) 和#pragma pack(pop) 以及#pragma pack()

    我们知道结构体内存对齐字节可以通过#pragma pack(n) 的方式来指定. 但是,有没有想过一个问题,某些时候我想4字节对齐,有些时候我又想1字节或者8字节对齐,那么怎么解决这个问题呢? 此时, ...

  6. 详解C/C++中的的:#pragma pack(push) 、#pragma pack(pop) 和#pragma pack()

    前言 我们知道结构体内存对齐字节可以通过#pragma pack(n) 的方式来指定. 但是,有没有想过一个问题,某些时候我想4字节对齐,有些时候我又想1字节或者8字节对齐,那么怎么解决这个问题呢? ...

  7. C语言字节对齐 __align(),__attribute((aligned (n))),#pragma pack(n)

    转载地址 : http://blog.csdn.net/21aspnet/article/details/6729724 一.概念    对齐跟数据在内存中的位置有关.如果一个变量的内存地址正好位于它 ...

  8. pragma pack(非常有用的字节对齐用法说明)

    强调一点: #pragma pack(4) typedef struct { char buf[3]; word a; }kk; #pragma pack() 对齐的原则是min(sizeof(wor ...

  9. 关于sizeof与#pragma pack 以及网络上关于字节对齐的一点感想

    工作中面试中对于字节对齐基本上是必考一个知识点,而很多面试是网络上上原题.基本上背一背就可以写正确,而关于4字节对齐我相信很多人也只是一个基本地了解,对于一些题目就感觉有问题,而且很多blog后面仍然 ...

随机推荐

  1. 【LeetCode-面试算法经典-Java实现】【05-Longest Palindromic Substring(最大回文字符串)】

    背景 近期開始研究算法,于是在leetcode上做算法题,第五题Longest Palindromic Substring便是关于回文子串的. 什么是回文字串 回文字符串是指将该字符串前后颠倒之后和该 ...

  2. POJ 1466 Girls and Boys (匈牙利算法 最大独立集)

    Girls and Boys Time Limit: 5000MS   Memory Limit: 10000K Total Submissions: 10912   Accepted: 4887 D ...

  3. linearlayout-weight 属性作用

    今天用到了weight的属性,现在就把这个属性的具体意义记录一下.也是参考网上的讲解,只不过自己验证了一下而已 参考自 http://blog.csdn.net/jincf2011/article/d ...

  4. 69.类型后缀,重载操作符""

    #include <iostream> using namespace std; class myclass { public: int num; int num2; public: my ...

  5. cap理论理解

    一个分布式系统里面,节点组成的网络本来应该是连通的.然而可能因为一些故障,使得有些节点之间不连通了,整个网络就分成了几块区域.数据就散布在了这些不连通的区域中.这就叫分区. 当你一个数据项只在一个节点 ...

  6. JS错误记录 - dom操作 - 排序

    本次练习错误总结: 1. for循环要套到按钮的onclick里面,否则onclick点击事件无法依次执行. 2. var n1, var n2 这两个变量是arr.sort排序使用的,所以应该放在s ...

  7. linux新安装后root密码设置

    linux在安装过程中未设置root密码 导致在使用中无法su 解决方法是设置root密码: 输入: sudo passwd root [sudo] password for you: ---> ...

  8. 今日SGU 5.3

    SGU 107 题意:输入一个N,表示N位数字里面有多少个的平方数的结尾9位是987654321 收获:打表,你发现相同位数的数相乘结果的最后几位,就和那两个相乘的数最后几位相乘一样,比如3416*8 ...

  9. ManagementObjectSearcher 对象获取串口列表

    首先,需引用using System.Management; 可先建个枚举类,如下 #region WIN32 API /// <summary> /// 枚举win32 api /// ...

  10. Modbus设备调试工具Winform(包括SRC0001、海康威视、TTS以及各种类型LED的测试)

    1.SRC寄存器读写测试 2.采集数据终端模块(这里是康海时代)调试 3.RS485传感器设备调试 4.LED/TTS/海康威视等展示设备调试 5.Modbus等协议规约资料及4-20mA设备调试 以 ...