#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\n",&(temp.a));
printf("b:0x%x\n",&(temp.b));
printf("c:0x%x\n",&(temp.c));
printf("size of temp is %d\n",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 出栈,并将对其方式设置为出栈的对齐方

#pragma pack(n)对齐格式的更多相关文章

  1. pragma pack,字节对齐

    关于字节对齐 pragma pack 一. 测试代码: // packTest.cpp : Defines the entry point for the console application. / ...

  2. #pragma pack(x) CPU对齐

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

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

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

  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. GNU C字节对齐__attribute__((aligned(n))) #pragma pack(n)

    在阅读gnu软件c源代码时,经常会遇到字节对齐相关操作,比如uboot命令相关的代码中,会遇到__attribute__((aligned(n)))扩展关键字,#pragma pack(n)预处理指令 ...

  8. #pragma pack() -----设置默认对齐数

    #pragma pack()  -----设置默认对齐数 预处理命令#pragma:程序如下 则根据修改的对齐数来算:则需要占据内存的大小是14 如果不进行设置,则按照编译器默认的对齐数来算:则需要占 ...

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

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

随机推荐

  1. UE4 Navmesh 室内导航设置

    我用的UE版本是4.14.1   系统:win10 64 前不久给样板房里面做了一个扫地机器人,导航设置让我头大了很久,度娘也没有用,最后在谷哥上有所感悟,现在给出本人的设置过程和解决方案. 一开始拖 ...

  2. java servlet数据库查询并将数据显示到jsp页面

    需要的jar包:mysql-connector-java.jar build path只是个jar包的引用,部署的时候想不丢包最好还是手动拷贝到对应项目的lib文件下. 在try{}中定义的变量为局部 ...

  3. Spring Cloud 微服务入门(二)--Spring Cloud 架构

    Spring Cloud整体核心架构:Rest服务,在Spring Cloud配置过程中,都是遵循Rest风格规范,在Rest处理中,必不可少两个对象端:服务的提供者(provider)和服务消费者( ...

  4. Mysql慢查询开启和查看 ,存储过程批量插入1000万条记录进行慢查询测试

    首先登陆进入Mysql命令行  执行sql      show variables like 'slow_query%';  结果为OFF 说明还未开启慢查询 执行sql     show varia ...

  5. JSP + servlet 源码 实现文件的上传

    JSP页面 upLoad.jsp _________________________________ <%@ page language="java" import=&quo ...

  6. C#的哈希表Hashtable同步方法

    在多线程环境的操作中对Hashtable进行操作需要进行同步控制,有两种方法,一种是由.Net自动控制:一种是在代码中自己控制. 1.使用Hashtable.Synchronized进行同步 Hash ...

  7. hadoop生态搭建(3节点)-13.mongodb配置

    # 13.mongodb配置_副本集_认证授权# ==================================================================安装 mongod ...

  8. 西安Uber优步司机奖励政策(8月10日到8月16日)

    1) 工作日(周一到周五)早高峰时间段(7点到9:30点).晚高峰时间段(5点到8点)车费 2.0 倍,每单奖励部分上限35元 例:在高峰时段中,假设行程基本车费为¥15,只要达到奖励前提,最后你将获 ...

  9. element-ui 分页注意事项

    <template> <div id="monitor"> 一页显示 {{currentCount}}条 当前第 {{currentPage}}页 < ...

  10. Oracle DELETE和TRUNCATE 的区别

    语法delete from aa truncate table aa 区别 1.delete from后面可以写条件,truncate不可以. 2.delete from记录是一条条删的,所删除的每行 ...