字节对齐
C语言结构体字节对齐简单计算方法

C语⾔结构体字节对齐简单计算⽅法
1.在C语⾔⾥⾯每⼀种数据类型都有字节对齐⽐如在32位操作系统下:整型的⾃⾝对齐数就是 4 字节,字符型就是 1 字节,double就是 8 字节。
但是结构体的计算⽅式就和普通的数据类型不⼀样。
在C语⾔⾥⾯字节对齐的⽅式主要根据“有效对齐数”来确定,那么有效对齐数是怎杨确定的呢?
在结构体⾥⾯::: 有效字节对齐数 = (⾃⾝对齐数 < 最⼤字节)?(⾃⾝对齐数):(最⼤字节);
⾃⾝对齐数 = 4字节(32位操作系统);(8 字节为32位操作系统)。
最⼤字节数 = 结构体⾥⾯最⼤的⼀个数据类型所占的字节数。
列:struct test{
char a;
int a;
short c;
}d;
sizeof(d) == ? ; //在32位操作系统下为12字节,64位操作系统下也为12字节。
(每⼀次都开4个字节)
struct test2{
char a;
double b;
short c;
}d;
sizeof(d) == ? ;// 在32位操作系统下为16字节(每⼀次开4个字节),在64位操作系统下为24字节(每⼀次开8个字节)。
字节对齐原则

字节对齐原则这个问题也是困扰了我很久的⼀个问题:为了加快数据存取的速度,编译器默认情况下会对结构体成员和结构体本⾝存储位置进⾏处理,使其存放的起始地址是⼀定字节数的倍数,⽽不是顺序存放,称为字节对齐.设对齐字节数为n(n = 1,2,4,8,16),每个成员内存长度为Li,Max(Li)为最⼤的成员内存长度,字节对齐规则是:1. 结构体对象的起始地址能够被Max(Li)所整除;2. 结构体中每个成员相对于起始地址的偏移量,即对齐值应是min(n,Li)的倍数.若不满⾜对齐值的要求,编译器会在成员之间填充若⼲个字节;3. 结构体的总长度值应是min(n,Max)(Li)的倍数,若不满⾜总长度值的要求,编译器在为最后⼀个成员分配空间后,会在其后填充若⼲个字节. (VC默认的对齐字节数n=8)开不懂,请看下⾯例⼦:#include <iostream>using namespace std;// 1加1+编译器补充的2个再加上int 的4个(编译器⾃动加的)typedef struct node1 // 1+1+(2)+4 = 8{char c1;char c2;int a;}str1 ;typedef struct str2 // 1+(3)+4+1+(3) = 12{char c1;int a;char c2;}str2 ;typedef struct str3 // 5+(3)+4+2+(2) = 16{char c1[5];int b;short c;}str3 ;typedef struct str4 // 5+(1)+(2)+4 = 12{char c1[5];short c;int b;}str4 ;typedef struct str5 // 1+1+(6)+8 = 16{char c1;char c2;double a;}str5 ;typedef struct str6 // 1+(7)+8+1+(7) = 24{char c1;double a;char c2;}str6 ;typedef struct str7{char c1;str1 s; // 相当于吧str1的结构放在这 char,char,intdouble b;}str7 ; // 1+1+1+(1)+4+4 = 12int main(){str1 s1;str2 s2;str3 s3;str4 s4;str5 s5;str5 s6;str7 s7;str8 s8;cout << "s1 = " << sizeof(s1)<<endl;cout << "s2 = " << sizeof(s2)<<endl; cout << "s3 = " << sizeof(s3)<<endl; cout << "s4 = " << sizeof(s4)<<endl; cout << "s5 = " << sizeof(s5)<<endl; cout << "s6 = " << sizeof(s6)<<endl; cout << "s7 = " << sizeof(s7)<<endl; cout << "s8 = " << sizeof(s8)<<endl; return0;}图解:str1str2:str3:str4:str5:str6:。
c语言字节对齐原理

c语言字节对齐原理C语言中的字节对齐原理是指在内存中分配变量存储空间时,为了提高访问效率和内存利用率,系统会按照一定的规则进行对齐操作。
字节对齐原理在C语言中非常重要,对于程序的正确性和性能都有着重要的影响。
字节对齐的原理是为了优化内存访问速度和空间利用率,避免因为不对齐而导致的性能降低。
在C语言中,变量的存储空间是以字节为单位进行分配的,而不同的数据类型在内存中所占的字节数是不同的。
字节对齐的目的是为了确保不同类型的变量在内存中的起始地址是对齐的,这样可以提高访问效率。
C语言中的字节对齐规则是由编译器来决定的,不同的编译器可能有不同的对齐规则。
一般来说,编译器会按照变量的自然对齐大小进行对齐。
自然对齐是指变量所占的字节数,例如char类型的变量自然对齐为1字节,int类型的变量自然对齐为4字节。
在进行字节对齐时,编译器会在变量之间插入一些空白字节,使得变量的起始地址能够满足对齐要求。
这样一来,虽然会浪费一些空间,但可以提高内存的访问效率。
例如,如果int类型的变量要求按4字节对齐,而其起始地址为0x1000,那么在其后紧接着的变量的起始地址就必须是0x1004,即起始地址必须是4的倍数。
字节对齐的规则并不是固定的,它受到编译器的影响。
有些编译器的默认对齐规则可能是按照变量的自然对齐大小来对齐的,而有些编译器可能会有一些特殊的对齐规则。
此外,开发人员也可以通过编译器提供的指令来手动控制字节对齐的方式。
字节对齐的原理和规则虽然复杂,但它对于程序的正确性和性能优化至关重要。
如果变量没有按照正确的对齐方式进行存储,可能会导致内存访问错误,甚至引发程序崩溃。
而且,字节对齐也会影响程序的性能,如果变量没有按照对齐要求进行存储,可能会导致内存访问速度变慢,从而影响程序的执行效率。
为了正确地使用字节对齐,开发人员需要了解编译器的对齐规则,并且在编写代码时遵循这些规则。
在一些特殊情况下,开发人员也可以使用编译器提供的指令来手动控制字节对齐的方式,以满足特定的需求。
c语言结构体中的数组字节对齐

C语言结构体中的数组字节对齐在C语言中,结构体是一种用户自定义的数据类型,用于将不同类型的数据组合在一起。
结构体中常常包含多个成员变量,其中可能有数组类型的成员变量。
在结构体中使用数组时,需要了解数组字节对齐的概念和规则,以确保内存的最佳利用和访问的效率。
什么是字节对齐字节对齐是指在将数据存储在计算机内存中时,按照特定规则进行调整,以确保数据的存储和访问的效率。
字节对齐的规则可以对齐数据的起始地址或者数据的长度。
计算机中的数据存储是按照字节(Byte)来划分的,一个字节通常由8个二进制位组成。
字节对齐的主要目的是为了节省内存和提高访问效率。
在C语言中,结构体中的成员变量通常按照字节对齐的规则来排列。
C语言结构体中的数组字节对齐规则在C语言中,结构体中的数组字节对齐规则通常遵循以下原则:1.结构体的起始地址必须是所有成员变量所要求对齐方式的最小公倍数。
2.结构体中的每个成员变量的地址必须是它本身的大小的整数倍。
3.结构体的总大小必须是其最大成员变量大小的整数倍。
根据字节对齐规则,如果结构体中的成员变量的累计大小不是字节对齐的倍数,编译器会在成员变量之间添加填充字节,以满足对齐要求。
这些填充字节在结构体的占用空间中不可访问。
填充字节的目的是将后续成员变量的地址对齐,以提高内存访问效率。
数组字节对齐的示例为了更好地理解数组字节对齐的规则,我们来看一个示例。
#include <stdio.h>struct MyStruct {char c;int i;char arr[3];};int main() {struct MyStruct s;printf("sizeof(MyStruct) = %lu\n", sizeof(struct MyStruct));printf("sizeof(s.c) = %lu\n", sizeof(s.c));printf("sizeof(s.i) = %lu\n", sizeof(s.i));printf("sizeof(s.arr) = %lu\n", sizeof(s.arr));return 0;}输出结果:sizeof(MyStruct) = 12sizeof(s.c) = 1sizeof(s.i) = 4sizeof(s.arr) = 3在这个示例中,我们定义了一个包含一个字符类型变量、一个整型变量和一个长度为3的字符数组的结构体MyStruct。
4字节对齐原理

4字节对齐原理小伙伴,今天咱们来唠唠4字节对齐这个超有趣的计算机原理。
你知道吗?这就像是计算机世界里的一种小默契呢。
在计算机的存储世界里啊,数据就像住在一个个小房子里,这些小房子就是字节。
4字节对齐就像是一种特殊的居住规则。
想象一下,字节们组成了一条条街道,每个数据都有自己的住所。
4字节对齐就是说,数据最好住在那些地址是4的倍数的小房子里。
为啥要有这样的规则呀?这可就大有讲究啦。
从计算机硬件的角度看,很多硬件设备在读取数据的时候,一次读取4个字节会特别高效。
就好像你去超市买东西,如果东西都按照一定的组合包装好,你拿起来就很方便。
计算机的处理器也是这样,如果数据按照4字节对齐,处理器一下子就能把它需要的数据整整齐齐地拿过来,就像你轻松拿起一组包装好的商品一样,速度那叫一个快。
而且哦,这种对齐方式还和数据的安全性、稳定性有关系呢。
如果数据是乱七八槽地存放,就像一群调皮的小动物没有住在自己该住的地方,很容易就会出乱子。
比如说,可能会出现数据被错误解读的情况。
但是按照4字节对齐,数据就像规规矩矩排好队的小朋友,大家都清楚自己的位置,不会搞混。
咱们再从软件的角度看看。
编写程序的程序员们也很喜欢4字节对齐呢。
因为这可以让程序运行得更流畅。
当程序需要调用数据的时候,如果数据是4字节对齐的,就像是走在一条规划好的平坦大道上,没有坑坑洼洼。
要是不按照这个规则,程序可能就会像一个在崎岖小路上行走的人,磕磕绊绊的。
比如说,有一个结构体,里面有不同类型的数据。
如果按照4字节对齐来安排这些数据的存储位置,那么这个结构体在内存中的布局就会特别整齐。
这就好比你整理自己的书架,按照一定的规则把书分类摆放,找起书来就特别容易。
在一些大型的软件项目里,4字节对齐更是起到了关键的作用。
就像一个大型的合唱团,每个成员都要站在自己该站的位置上,这样整个合唱团才能唱出和谐美妙的歌曲。
如果数据不按照4字节对齐,就像合唱团里有人站错了位置,那唱出来的歌可就不好听啦,程序也会出现各种莫名其妙的问题。
C语言字节对齐

C语言字节对齐字节对齐的由来程序在运行时会将数据临时存放在内存中,芯片内核需要对这些数据进行计算,不断的读取内存以获得数据,并将计算结果写入内存。
计算机体系经过若干年的发展,最终确定了以8bits作为其基本的存储单元——byte(字节),这是每个地址所对应的最小访问单元,在C语言中对应一个char型的变量。
下图为芯片内核访问内存的示意图。
芯片内核通过控制总线控制内存的动作,通过地址总线告知内存地址,数据总线上出现交互的数据。
图1访问内存示意图假设上图是8位机的示意图,那么数据总线的宽度是8bits,由8根数据线组成,这样芯片内核与内存之间一次就可以同时交换8个bits的数据,正好是一个字节。
图中右侧的每个小格子代表一个存储地址,对应一个字节。
下面通过一段C语言代码来具体看看芯片内核与内存之间的数据交互过程。
char data[2];data[0]=2;data[1]=data[0]+1;第一行代码定义了2个字节的数组data。
假设data数组被编译到地址0x100,那么data[0]这个字节就被存储在地址为0x100的内存空间,data[1]这个字节就被存储在地址为0x101的内存空间。
第二行对应的硬件动作是将数据2存入到data[0]中,也就是将数据2存入到内存中的0x100地址,执行这条语句时,芯片内核对控制总线、地址总线和数据总线进行操作,控制总线上出现写信号,地址总线上出现数据0x100,数据总线上出现数据0x02。
此时内存就知道需要将数据2写入到地址0x100中,完成一次写操作。
第三行先读出data[0]中的数据,芯片内核将控制总线置为读信号,将地址总线置为0x100,此时,内存就会从其内部取出0x100地址中的数据,也就是数据2,2将出现在数据总线上,此时芯片内核就会通过数据总线读取到data[0]中的数据了。
接下来芯片内核计算2+1=3,需要将数字3写入到data[1]中,芯片内核将控制总线置为写信号,将地址总线置为0x101,将数据总线置为3,内存接收到这些信号后,就会将数据3存入到其内部0x101地址中,完成本次操作。
256字节对齐计算公式
256字节对齐计算公式摘要:1.256 字节对齐计算公式的背景和意义2.256 字节对齐计算公式的定义和原理3.256 字节对齐计算公式的计算方法和步骤4.256 字节对齐计算公式的应用场景和示例5.256 字节对齐计算公式的优缺点分析正文:【256 字节对齐计算公式的背景和意义】在计算机科学中,数据存储和传输往往需要考虑数据对齐的问题。
对齐是指将数据按照一定的规则排列,以便于快速访问和处理。
在网络通信和数据存储领域,256 字节对齐计算公式被广泛应用,它可以帮助我们计算数据在存储或传输时需要进行的对齐操作。
【256 字节对齐计算公式的定义和原理】256 字节对齐计算公式是指,在数据存储或传输过程中,将数据按照256 字节的大小进行对齐。
这样做的目的是为了提高数据访问的效率,因为计算机内存读取数据的速度与数据对齐的程度密切相关。
256 字节对齐计算公式的原理是,将数据按照256 字节的大小进行分组,然后计算每个分组的偏移量,以便于快速定位和访问数据。
【256 字节对齐计算公式的计算方法和步骤】计算256 字节对齐计算公式的方法一般包括以下几个步骤:1.确定数据大小:首先需要确定待处理数据的大小,通常以字节为单位。
2.分组:将数据按照256 字节的大小进行分组,如果数据大小不足256 字节,则在最后一组中填充零。
3.计算偏移量:对于每个分组,计算其相对于基准位置的偏移量。
偏移量可以通过取模运算来实现,即偏移量= 数据大小% 256。
4.存储偏移量:将每个分组的偏移量存储在特定的偏移量表中,以便于在数据访问时快速查找。
【256 字节对齐计算公式的应用场景和示例】256 字节对齐计算公式在很多场景中都有应用,例如:1.网络通信:在网络通信中,数据传输往往需要按照256 字节的大小进行分组,以便于快速处理和解析。
2.数据存储:在数据存储中,将数据按照256 字节的大小进行对齐,可以提高磁盘读取速度,从而提高整体性能。
256字节对齐计算公式
256字节对齐计算公式1.引言在计算机领域,内存对齐是一种重要的概念,它与数据在内存中的存放方式密切相关。
其中,256字节对齐是一种常见的对齐方式。
本文将介绍256字节对齐的计算公式,帮助读者更好地理解和应用该对齐方式。
2.什么是内存对齐内存对齐是指变量在内存中存放时按照一定的规则对其进行排列的过程。
由于计算机硬件读取数据的机制,对齐可以提高数据的读取效率。
对齐通常以字节为单位进行,比如4字节对齐、8字节对齐等。
3.为什么选择256字节对齐在某些应用场景下,特别是在嵌入式系统或高性能计算中,选择256字节对齐可以获得更好的性能。
这是因为256字节对齐可以最大限度地利用计算机硬件的特性,提高数据的读取和处理效率。
4. 256字节对齐计算公式假设需要存放的变量为V(以字节为单位),256字节对齐的计算公式如下:A l ig ne dA dd re ss=((V+255)/256)*256其中,A li gn ed Ad dr e ss表示对齐后的起始地址。
5.举例说明为了更好地理解256字节对齐计算公式,我们来看一个具体的例子。
假设有一个结构体需要存放在内存中,其成员变量分别为:i n ta;c ha rb;d ou ble c;这三个变量的字节大小分别为4、1和8字节。
编译器为了对齐考虑,会按照最大字节大小的变量进行对齐,即8字节对齐。
首先,计算出结构体在内存中的大小:4+1+8=13字节。
然后,按照256字节对齐计算公式进行计算:A l ig ne dA dd re ss=((13+255)/256)*256=512即结构体在内存中的起始地址为512字节。
6.总结256字节对齐是一种常见的内存对齐方式,可以提高数据在内存中的读取和处理效率。
本文介绍了256字节对齐的计算公式,并通过一个具体的例子进行了说明。
希望读者通过本文的介绍,对256字节对齐有更深入的理解,并能在实际的项目中合理应用。
1字节对齐定义
1字节对齐定义摘要:1.1 字节对齐的定义2.1 字节对齐的应用场景3.1 字节对齐的实现方法4.1 字节对齐的优缺点正文:1 字节对齐是一种计算机编程中的数据存储和处理技术,指的是在数据存储或传输过程中,每个数据项的开始位置都与其大小对齐,即数据的地址与其大小的整数倍对齐。
这种对齐方式可以提高数据处理的效率,特别是在大规模数据处理和传输过程中,可以减少数据处理的时间和成本。
1 字节对齐的应用场景主要包括以下几种:一是在网络传输中,对数据进行1 字节对齐可以减少传输的时间和带宽的占用。
例如,在HTTP 协议中,如果数据包的大小不是整数倍,就需要进行数据填充,以达到1 字节对齐的要求。
二是在数据存储中,对数据进行1 字节对齐可以提高存储的效率和速度。
例如,在硬盘存储中,如果数据的大小不是512 字节的整数倍,就需要进行数据填充,以达到512 字节的整数倍,这样可以提高硬盘的读写速度。
三是在数据处理中,对数据进行1 字节对齐可以提高处理的效率和精度。
例如,在图像处理中,如果图像的大小不是整数倍,就需要进行图像填充,以达到整数倍的要求,这样可以提高图像处理的精度和速度。
1 字节对齐的实现方法主要包括以下几种:一是数据填充。
在进行数据存储或传输时,如果数据的大小不是整数倍,就需要进行数据填充,以达到整数倍的要求。
二是数据截取。
在进行数据存储或传输时,如果数据的大小超过整数倍,就需要进行数据截取,以达到整数倍的要求。
三是数据转换。
在进行数据存储或传输时,如果数据的大小不能被整除,就可以通过数据转换的方式,将其转换为可以被整除的大小。
1 字节对齐的优缺点主要包括以下几点:优点:可以提高数据处理的效率和精度,特别是在大规模数据处理和传输过程中,可以减少数据处理的时间和成本。
什么是字节对齐,为什么要对齐
什么是字节对齐,为什么要对齐一.什么是字节对齐,为什么要对齐?一.什么是字节对齐,为什么要对齐?现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。
对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。
一些平台对某些特定类型的数据只能从某些特定地址开始存取。
比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失。
比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit数据。
显然在读取效率上下降很多。
二.字节对齐对程序的影响:先让我们看几个例子吧(32bit,x86环境,gcc编译器):设结构体如下定义:struct A{char b;short c;};struct B{char b;int a;short c;};现在已知32位机器上各种数据类型的长度如下:char:1(有符号无符号同)short:2(有符号无符号同)int:4(有符号无符号同)long:4(有符号无符号同)float:4 double:8那么上面两个结构大小如何呢?结果是:sizeof(strcut A)值为8sizeof(struct B)的值却是12结构体A中包含了4字节长度的int一个,1字节长度的char一个和2字节长度的short型数据一个,B也一样;按理说A,B大小应该都是7字节。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
根据以下资料,自己在两个编译器平台上试了试。
1.VC6.0(32bit X86系统上)
没指定对齐方式的前提下是,按照对齐算法要求排列的
2.KEIL4(C51)
单片机51中是单字节对齐方式
网上查看了资料,下面是摘自网络上的资料。
首先来看下在C/C++中定义如下的结构体,然后对他们分别进行sizeof()运算,看看结果会如何
struct A
{
int a;
char b;
short c;
};
struct B
{
char b;
int a;
short c;
};
#pragma pack(push,2) /*指定2字节对齐*/
struct C
{
char b;
int a;
short c;
};
#pragma pack (pop) /*还原默认字节对齐*/
#pragma pack (push,1) /*指定1字节对齐*/
struct D
{
char b;
int a;
short c;
};
#pragma pack (pop) /*还原默认字节对齐*/
各个结构体内的变量只是顺序不一样!各变量字节和为1+4+2=7个字节,而对各个结构体进行sizeof()运算所得的结果却是不一样的:
sizeof(A)==8 sizeof(B)==12 sizeof(C)==8 sizeof(D)==7
非常有趣吧?造成这个差异的是什么原因呢?其实就是下面要讲的C/C++中的字节对齐。
什么是字节对齐以及为什么要对齐?
现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是字节对齐。
而各个硬件平台对存储空间的处理上有很大的不同。
一些平台对某些特定类型的数据只能从某些特定地址开始存取。
其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失。
比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那么一个读周期就可以读出,而如果存放在奇地址开始的地方,就可能会需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该int数据。
显然在读取效率上下降很多。
这也是空间和时间的博弈。
对齐的实现
通常,我们写程序的时候,不需要考虑对齐问题。
编译器会替我们选择时候目标平台的对齐策略。
当然,我们也可以通知给编译器传递预编译指令而改变对指定数据的对齐方法。
但是,正因为我们一般不需要关心这个问题,所以因为编辑器对数据存放做了对齐,而我们不了解的话,常常会对一些问题感到迷惑,本文上面的例子就如此。
对齐的算法
由于各个平台和编译器的不同,现以vc6.0(32位x86平台)为例子,来讨论上例中编译器对struct数据结构中的各成员如何进行对齐的。
这里面有四个概念值:
说的有点晕,自己总结的,
分两种:
一种,指定对齐方式
按照自身对齐值和指定对齐值中较小的那个值,排列成员地址空间
一种是,不指定对齐方式
按照成员中自身对齐值最大的那个值,排列成员地址空间
1.数据类型自身的对齐值:就是上面交代的基本数据类型的自身对齐值。
2.指定对齐值:#pragma pack(push,value)时的指定对齐值value。
3.结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值。
4.数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中较小的那个值。
有了这些值,我们就可以很方便的来讨论具体数据结构的成员和其自身的对齐方式。
有效对齐值N是最终用来决定数据存放地址方式的值,最重要。
有效对齐N,就是表示“对齐在N上”,也就是说该数据的"存放起始地址%N=0".而数据结构中的数据变量都是按定义的先后顺序来排放的。
第一个数据变量的起始地址就是数据结构的起始地址。
结构体的成员变量要对齐排放,结构体本身也要根据自身的有效对齐值圆整(就是结构体成员变量占用总长度需要是对结构体有效对齐值的整数倍,结合下面例子理解)。
这样就不能理解上面例子的值了。
例子分析:
结构体B分析
struct B
{
char b;
int a;
short c;
};
假设B从地址空间0x0000开始排放。
该例子中没有定义指定对齐值,在vc6.0环境下,该值默认为4。
第一个成员变量b的自身对齐值是1,比指定或者默认指定对齐值4小,所以其有效对齐值为1,所以其存放地址0x0000符合0x0000%1=0.第二个成员变量a的自身对齐值为4,所以有效对齐值也为4,所以只能存放在起始地址为0x0004到0x0007这四个连续的字节空间中,复核0x0004%4=0, 且紧靠第一个变量。
第三个变量c,自身对齐值为2,所以有效对齐值也是2,可以存放在0x0008到0x0009这两个字节空间中,符合0x0008%2=0。
所以从0x0000到0x0009存放的都是结构体B的内容。
再来看看数据结构B的自身对齐值为其变量中最大对齐值(这里是a)所以就是4,所以结构体的有效对齐值也是4。
根据结构体圆整的要求,0x0009到0x0000=10字节,(10+2)%4=0。
所以0x0000A到0x000B也为结构体B所占用。
故B从0x0000到0x000B共有12个字节,sizeof(B) == 12
结构体C分析
#pragma pack(push,2) /*指定按2字节对齐*/
struct C
{
char b;
int a;
short c;
};
#pragma pack(pop) /*还原默认字节对齐*/
第一个变量b的自身对齐值为1,指定对齐值为2,所以,其有效对齐值为1,假设C 从0x0000开始,那么b存放在0x0000,符合0x0000%1=0;第二个变量,自身对齐值为4,指定对齐值为2,所以有效对齐值为2,所以顺序存放在0x0002、0x0003、0x0004、0x0005四个连续字节中,符合0x0002%2=0。
第三个变量c的自身对齐值为2,所以有效对齐值为2,顺序存放在0x0006、0x0007中,符合0x0006%2=0。
所以从0x0000到0x00007共八
字节存放的是C的变量。
又C的自身对齐值为4,所以C的有效对齐值为2。
又8%2=0,C 只占用0x0000到0x0007的八个字节。
所以sizeof(C) == 8
最后来说一下,如果指定字节对齐为1字节,那么这个结构体实际占用的字节大小就是结构体内各变量真实占用字节大小之和!!怎么样,明白了吧!^^。