原文出处:【点击,进入原文页面】
今天在看结构体和共用体部分的时候,遇到了一个新名词“内存对齐”。先引入问题吧。如下:
sizeof(p1)=?
这个很简单得出答案,即20+4+1+15=40Byte。如果将phone[15]改为phone[16],结果是44。难道不是41吗?
这里便要引入内存对齐的概念。内存为了提高访问效率,便规定以结构体中最大的基本单位长度为对齐标准。即实际分配的内存大小是对齐标准的整数倍(必要条件)。在上面的结构体中,最大的基本类型是int。因此以4Byte为对其标准。所以实际内存大小应该为4的整数倍,即为44Byte.
也许你有疑惑:name[20]不是要20Byte吗,为什么以4Byte为对齐标准?请注意这里的基本类型。name[20]是一个字符串数组,数组属于复合的数据类型。复合的数据类型还有结构体,共用体。基本的数据类型是整型,字符型,浮点型。如果你还有不解,那么看下题:
在student结构体中含有数据类型为struct score这样的变量。struct score的大小为12Byte,也是struct student结构体中最大的数据类型,但是我们的对齐标准是4Byte,就如我们刚说的那样,内存的对齐标准是取结构体中最大的基本数据类型,这里我们取sizeof(int)。
再看下面的问题:
sizeof(struct data1)=? sizeof(struct data2)=?
对于前者,由于共用体的存储大小由最大的成员来决定,因此上题中共用体的存储大小为9Byte,考虑到内存对齐,它以sizeof(int)=4Byte来对齐,因此实际内存分配大小是12Byte。对于后者,存储大小是4+1+9=14Byte,这个结构体以4对齐,因此实际分配大小为16Byte。
现在你应该对于共用体和结构体的内存对齐有所了解了。那么再接着往下看:
sizeof(struct data)=?
有了上面的理解,10肯定不会是答案,那么会是16吧。也错。正确答案是24。你可能会感到莫名其妙:按照上面所说的方法,以8为对齐标准,那么10不是8的倍数,那就是16呀。为什么呢?请你耐心看下面。
首先我们知道结构体变量是分配的连续内存空间。d毫无疑问是分配8Byte,对于d“前面”的c,按照对齐标准我们应该分配8Byte,而d后面的ch,按照对齐标准也应该分配8Byte。因此结果是24。
如果这样:
sizeof(struct data)=16。
因为内存没必要分别为c和ch分配8Byte来进行对齐,将它们放在一个8byte里就可以实现内存对齐。上面在引入内存对齐概念的时候,我用括号特别注释必要条件便是说明此处内容。
分享到:
相关推荐
结构体字节对齐规则,主要是介绍结构体字节对齐规则,内容有点长,但是很全面.
写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的变量总长度要大,这是怎么回事呢?讲讲字节对齐吧.
介绍C语言字节对齐的文档,对C语言字节对齐讲述得很清楚,特别适合新手对结构体不清楚的情况下参考
# 改变结构体成员的字节对齐 ## 例子 #include typedef struct { char a; int b; } ST_A;
要求数据内存的起始地址的值是某个数k的倍数,这就是所谓的内存对齐,本文就来深入剖析C++中的struct结构体字节对齐,需要的朋友可以参考下
讲讲字节对齐吧. /******************************分割线 如果体系结构是不对齐的,A中的成员将会一个挨一个存储,从而sizeof(a)为11。显然对齐更浪费了空间。那么为什么要使用对齐呢?体系结构的对齐和不对齐,是在...
在这里就分享两条开发中曾经忽略的问题:1、Union(联合体)的字节对齐先看代码:#pragma pack(4)struct com{ union { double dTest; int nTest; char szTest[14]; }; char chTest1; char chTest2;};#pragma...
struct S1 { char c; int i; }; sizeof(s1)在VC6中按默认设置得到的结果为8。 我们先看看sizeof的定义——sizeof的结果等于对象或者类型所占的内存字节数,好吧,那让我们来看看S1的内存分配...
介绍C/C++中内存对齐(字节对齐)的概念以及对齐规则。通过示例代码和图示帮助理解。
A:首先先不讨论结构体按多少字节对齐,先看看只以1字节对齐的情况: #include #include #define PRINT_D(intValue) printf(#intValue is %d\n, (intValue)); #define OFFSET(struct,member) ((char *)&((struct ...
#pragma pack(n) (n=1/2/4/8):按n字节对齐 #pragma pack(2) struct mystruct1 { int a; char b; short c; } struct mystruct2 { int a;; double b; short c; } #pragma pack() 以上这部分内容是...
struct MyStruct { double dda1; char dda; int type }; 对结构MyStruct采用sizeof会出现什么结果呢?sizeof(MyStruct)为多少呢?也许你会这样求: sizeof(MyStruct)=sizeof(double)+sizeof(char)+...
Tp01.struct的使用,及字节对齐;struct和class的差别与联系;struct中指针的危险性。 Tp02.extern C修饰的作用及头文件宏保护。 Tp03.变量a的定义 Tp04.static的作用。 Tp05.volatile Tp06.位操作 Tp07.中断...
字节顺序,大小和对齐方式默认情况下,C类型以计算机的本机格式和字节顺序表示,并在必要时通过跳过填充字节来正确对齐(根据C编译器使用的规则)。 或者,根据下表,格式字符串的第一个字符可用于指示字节
C++中的内存对齐实例详解 内存对齐 在我们的程序中,数据结构还有变量等等都需要占有内存,在很多系统中,它都要求内存分配的时候要对齐,这样做的好处就是可以提高访问内存的速度。 我们还是先来看一段简单的...
这些问题或许对不少朋友来说还有点模糊,那么本文就试着探究它们背后的秘密。 首先,至少有一点可以肯定,那就是ANSI C保证结构体中各字段在内存中出现的位置是随它们的声明顺序依次递增的,并且第一个字段的首地址...
2.内存对齐的问题,Windows默认的对齐是4字节,如果不去刻意关闭掉对齐的话,那么可能会多出不少没必要的字节数,但是如果关闭了,内存拷贝又会慢一些。 序列化是怎么序列化的? 其实很简单,我们使用一个uint8类型...
块式管理:把主存分为一大块、一大块的,当所需的程序片断不在主存时就分配一块主存空间,把程 序片断load入主存,就算所需的程序片度只有几个字节也只能把这一块分配给它。这样会造成很大的浪费,平均浪费了50%的...
这些结构是位压缩的,将允许任何类型(包括浮点)的未对齐值。 这允许非常灵活的网络消息解码。 用法 Struct.js 语法 Struct.js 只将字符:AZ、0-9 和 _ 解释为标识符字符,标识符不能以数字开头。 顶级实体必须用...