关闭

字节对齐(摘自CSDN)

298人阅读 评论(0) 收藏 举报
分类:

笔试的时候经常有一些字节对齐的题目,每次都要去看看但每次都会忘记,借用一下别人总结比较好的,以后经常翻看:

3条原则我自己设计了一个口诀,便于记忆(前面有N个跟我一样大的人,而怪兽前面有N个他吃掉的最大的那个人的大小,我们这个整体是由最大的那个人复制的)

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

 

 

 

上面是你随便 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分钟到了,自己去测试吧.

 

ps:Vc,Vs等编译器默认是#pragma pack(8),所以测试我们的规则会正常;注意gcc默认是#pragma pack(4),并且gcc只支持1,2,4对齐。套用三原则里计算的对齐值是不能大于#pragma pack指定的n值。

0
0
查看评论

摘自csdn

什么是爱情 石头问:我究竟该找个我爱的人做我的妻子呢?还是该找个爱我的人做我的妻子呢?佛笑了笑:这个问题的答案其实就在你自己的心底。这些年来,能让你爱得死去活来,能让你感觉得到生活充实,能让你挺起胸不断往前走,是你爱的人呢?还是爱你的人呢?石头也笑了:可是朋友们都劝我找个爱我的女孩做我的妻子?佛说:...
  • Sweet2008
  • Sweet2008
  • 2007-05-14 13:16
  • 171

NDK 编译armebai-v7a的非4字节对齐crash Fatal signal 7 (SIGSEGV) 错误解决

一直都是编译armabi的,没有任何问题,这个架构是软件模拟浮点运算的。 后来看到NDK文档上说armabi-v7a是针对有硬件处理浮点计算的arm cpu的。 于是就修改配置编译armebai-v7a的so文件。 结果是编译没问题,一运行就是crash掉,Fatal signal 7 (S...
  • tom_221x
  • tom_221x
  • 2015-07-08 14:28
  • 1321

任意字节对齐的内存分配和释放

任意自己内存对齐,intel笔试
  • Gen_Ye
  • Gen_Ye
  • 2016-09-28 23:00
  • 1701

C++中的字节对齐

本博客(http://blog.csdn.net/livelylittlefish)贴出作者(三二一、小鱼)相关研究、学习内容所做的笔记,欢迎广大朋友指正! 字节对齐 1. 基本概念字节对齐:计算机存储系统中以Byte为单位存储数据,不同数据类型所占的空间不同,如:整型(int)...
  • livelylittlefish
  • livelylittlefish
  • 2009-01-29 23:04
  • 5160

编程习惯---(摘自)CSDN程序员

编程习惯 1 版本控制版本控制是一种在开发的过程中对软件开发的历史系统地跟踪的方法。此项任务由版本控制系统完成,如CVS或Subversion。版本系统保持了一个受控编码的历史痕迹,提供很多操作:获得当前版本代码(通常称为“检出”);“提交”修改;“更新”工作拷贝来协调他人的修改。版本控制...
  • foreverke5868
  • foreverke5868
  • 2009-10-31 17:35
  • 228

android 返回结果。摘自csdn

public static final int ACT_RESULT_SCANER = 1;// 二维码扫描后的结果 public static final int ACT_RESULT_FILE = 2;// 选择文件后的结果 public static final int ACT_RESUL...
  • zanfeng
  • zanfeng
  • 2014-01-31 00:09
  • 548

程序员修养(摘自csdn)

一忌:轻易言败,没有自信  没有永不放弃精神的程序员,只是一个有程序员名号的假程序员。一个真正的程序员,知道在程序设计的过程中,可能会遇到不计其数的困难和问题,可能有极多的挫折和失败,而成功只有一次。  就为解决一个问题,我们可能连续十几甚至几十小时的坐在计算机前不停的工作。一个问题解决了,可能又有...
  • dickwin
  • dickwin
  • 2006-01-15 01:08
  • 1030

关于字节对齐的理解

字节对齐的剖析 一、需要了解的名词和概念 1、数据类型自身的对齐值:即数据本身所占字节长度。 2、结构体或类的自身对齐值:即其中数据成员类型对齐值的最大值。 3、指定对齐值:由编程人员通过#pragma pack(value)指定的value值,通过#pragma pack()代码解除。 4、结构体...
  • zhang360896270
  • zhang360896270
  • 2014-09-17 11:52
  • 2259

C++字节对齐与结构体大小计算

转载注明出处:http://pppboy.blog.163.com/blog/static/30203796201082494026399/ 感谢原创博主的辛勤成果。
  • loveRooney
  • loveRooney
  • 2014-07-29 11:24
  • 1840

四字节内存对齐

首先我们先看看下面的C语言的结构体: typedef struct MemAlign { int a; char b[3]; int c; }MemAlign;     以上这个结构体占用内存多少空间呢?也许你会说,这个简单,计算每个类型的大小,将它们...
  • liujianli123
  • liujianli123
  • 2015-08-05 16:55
  • 1737
    个人资料
    • 访问:27045次
    • 积分:387
    • 等级:
    • 排名:千里之外
    • 原创:31篇
    • 转载:14篇
    • 译文:0篇
    • 评论:3条
    文章分类
    最新评论