关于字节对齐
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. ajax动态更新下拉列表

    前面做了一个ajax的小demo,今天看一个动态更新下拉列表,或者也叫级联更新下拉列表,这个也是利用ajax的异步调用去后台实现数据请求.然后回到前台完毕下拉列表数据的更新,以增强web应用的交互性. ...

  2. vim-缓存区中打开另外一个文件的方法

    现在有这么一种情况:    我现在在ubuntu用户根目录下--    我根目录下有一个文件夹blogs,这个文件夹下面有两个文件:text1,text2.    我现在从-目录下进行如下操作    ...

  3. .Net强类型视图

    1.控制器 Controllers/StoreController.cs using System; using System.Collections.Generic; using System.Li ...

  4. Vue的响应原理

    渲染render function之后就是 核心的响应式过程了 Object.defineProperty vue的核心之一就是Object.defineProperty 方法(IE9及其以上) Ob ...

  5. CentOS6.5下的Nagios安装配置详解(图文)

    最近因为,科研需要,接触上了Nagios,这里,我将安装笔记做个详解.为自己后续需要和博友们学习! VMware workstation 11 的下载 VMWare Workstation 11的安装 ...

  6. Spring Cloud Netflix Eureka client源码分析

    1.client端 EurekaClient提供三个功能: EurekaClient API contracts are:* - provide the ability to get Instance ...

  7. LuoguP2763 试题库问题(最大流)

    建图同_____ 代码: #include<queue> #include<cstdio> #include<cstring> #include<algori ...

  8. logname---显示用户名称

    logname命令用来显示用户名称.

  9. 【Codeforces Round #457 (Div. 2) C】Jamie and Interesting Graph

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 找比n-1大的最小的素数x 1-2,2-3..(n-2)-(n-1)长度都为1 然后(n-1)-n长度为(x-(n-2)) 然后其他 ...

  10. Myeclipse学习总结(3)——Myeclipse中的代码格式化、注释模板及保存时自动格式化

    设置Myeclipse中的代码格式化.注释模板及保存时自动格式化 1:设置注释的模板: 下载此模板:  codetemplates.xml This XML file does not appear ...