5分钟搞定内存字节对齐

news/2024/7/7 21:05:42 标签: struct, 存储, 编译器, google, float, 测试

写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的变量总长度要大,这是怎么回事呢?讲讲字节对齐吧.

/******************************分割线

如果体系结构是不对齐的,A中的成员将会一个挨一个存储,从而sizeof(a)为11。显然对齐更浪费了空间。那么为什么要使用对齐呢?
体系结构的对齐和不对齐,是在时间和空间上的一个权衡。对齐节省了时间。假设一个体系结构的字长为w,那么它同时就假设了在这种体系结构上对宽度为w的数据的处理最频繁也是最重要的。它的设计也是从优先提高对w位数据操作的效率来考虑的。比如说读写时.............此处省略50万字

***********************************************************/

上面是你随便 google一下,人家就可以跟你解释的,一大堆的道理,我们没怎么多时间,讨论为何要对齐.直入主题,怎么判断内存对齐规则,sizeof的结果怎么来的,请牢记以下3条原则:(在没有#pragma pack宏的情况下)

1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储

2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)

3:收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐.

等你看完此3条原则,2分钟已经过去,抓紧时间,实战3分钟:

typedef struct bb
{
 int id;             //[0]....[3]
 double weight;      //[8].....[15]      原则1
 float height;      //[16]..[19],总长要为8的整数倍,补齐[20]...[23]     原则3
}BB;

typedef struct aa
{
 char name[2];     //[0],[1]
 int  id;         //[4]...[7]          原则1

 double score;     //[8]....[15]    
 short grade;    //[16],[17]        
 BB b;             //[24]......[47]          原则2
}AA;

int main()
{
  AA a;
  cout<<sizeof(a)<<" "<<sizeof(BB)<<endl;
  return 0;
}

结果是

48 24
ok,上面的全看明白了,内存对齐基本过关.

再讲讲#pragma pack().

在代码前加一句#pragma pack(1),你会很高兴的发现,上面的代码输出为

32 16
bb是4+8+4=16,aa是2+4+8+2+16=32;

这不是理想中的没有内存对齐的世界吗.没错,#pragma pack(1),告诉编译器,所有的对齐都按照1的整数倍对齐,换句话说就是没有对齐规则.

明白了不?

那#pragma pack(2)的结果又是多少呢?对不起,5分钟到了,自己去测试吧.


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hairetz/archive/2009/04/16/4084088.aspx


http://www.niftyadmin.cn/n/1536044.html

相关文章

总结一下DLL声明的一些问题

有关DLL的问题现在资料很多&#xff0c;但是很多人写DLL时经常出现调用程序无法找到相关的导出函数的问题&#xff0c;这里主要的原因是DLL在声明时出的问题。 在这里主要有两个问题&#xff0c;一个是调用约定的问题&#xff0c;一个是函数名修饰的问题&#xff0c;而这两个问…

8 全局变量_大规模并行处理器编程实战8

第八章 并行模式&#xff1a;卷积 ----- 介绍常数存储器和高速缓存8-10 章 介绍重要的并行计算模式&#xff0c;是很多并行算法的基础。本章是介绍卷积&#xff0c;以及从存储器的优化思路去优化卷积代码。1. 卷积&#xff1a;1.1 卷积并行特点&#xff1a;a. 每个输出元素的计…

一个测试基础面试题——如何测试web银行开户

之前面试被问到过这样一个问题&#xff0c;自己答的都是一些UI界面上的case&#xff0c;看了一些大神的关于这类面试题的总结才知道自己差的不是一点半点&#xff0c;今天也总结下。 内管银行开户&#xff0c;有账号、用户名、用户证件类型、证件号三个栏位&#xff0c;针对这个…

jsessionid和jwt_jsessionid

ntellij idea插件2020-12-25 17:03:27第一次从Eclipse转到idea时&#xff0c;那时候确实挺难受的&#xff0c;各种不是习惯&#xff0c;各种抵触&#xff0c;后来设置一些eclipse的使用习惯&#xff0c;发现越来越好用了&#xff0c;作为一名开发&#xff0c;工欲善其事必先利其…

软件外包行业分析

目前已经进驻上海的知名全球服务外包企业包括埃森哲、优利、NCS、博朗、爱特优科等 目录&#xff1a;[0] - 为什么要对大学生谈软件外包&#xff1f;[1] - 什么是软件外包&#xff1f;[2] - 软件为什么要外包&#xff1f;[3] - 为什么要承接软件外包[4] - 做软件外包有前途吗&…

php检测目标服务器是否宕机_记录一次服务器宕机分析过程(1)-排查问题

发现宕机&启动coredump最近给版署审核版本用的服务器每隔几天就会宕机&#xff0c;情况比较类似&#xff0c;都是大厅服的进程直接没有掉了。查看服务器log&#xff0c;没有发现什么线索。怀疑是服务器进程崩溃掉了&#xff0c;于是开启了服务器的coredump&#xff0c;等待…

关于sizeof()的一些思考

原始连接&#xff1a;http://lostinmymind.blogchina.com/index.html关键字&#xff1a;sizeof&#xff0c;字节对齐&#xff0c;多继承&#xff0c;虚拟继承&#xff0c;成员函数指针 前向声明&#xff1a; sizeof&#xff0c;一个其貌不扬的家伙&#xff0c;引无数菜鸟竟折…

Hibernate入门----配置文件

一、Hibernate简介 hibernate是一个开源的&#xff0c;轻量级的&#xff0c;持久成ORM框架。 Hibernate是一个开放源代码的对象关系映射框架&#xff0c;它对JDBC进行了非常轻量级的对象封装&#xff0c;它将POJO与数据库表建立映射关系&#xff0c;是一个全自动的 orm框架&…