字节对齐

C语言中内存对齐与结构体

帅比萌擦擦* 提交于 2019-11-30 06:34:47
结构体 结构体是一种新的数据类型,对C语言的数据类型进行了极大的扩充。 struct STU{ int age; char name[15]; }; struct STU a; //结构体实例 struct STU *b; //结构体指针 1、可以通过a.age对其进行取成员的操作,b->age也可以进行结构体的操作,b->age存在问题,必须有一个结构体空间已经让b指向,b的值为此结构体空间的地址。 2、a.name = "lilei"; false,因为name是数组名称,指针常量不能赋值,解决方案:strcpy()函数 3、字符串直接进行比较的话,是其地址的比较,没有什么意义,用strcmp()函数进行比较,就是ASCII码的比较了。 内存对齐 操作系统对于内存空间的分配,遵循如下原则:总是从2^n倍数为地址的字节处开始分配空间。 如:若按4B对其模式的话,则每个变量(结构体成员)的首地址总是从编号为4的整数倍的字节处开始分配空间。 可设几字节对齐如下 #pragma pack(push) //保持原对齐格式 #pragma pack(1) //设定为n字节格式 ....... #pragma pack(pop) //恢复为原对齐格式 1、结构体大小 (1)、总大小是下一个类型的整数倍,否则用单字节补齐(单字节最多补到4/8,具体看结构体中最宽几字节) /

按字节对齐

穿精又带淫゛_ 提交于 2019-11-30 04:38:38
#pragma pack(1)表示结构体的内存必须按1个字节对齐。一般结构体的成员都是超过1个字节的,所以结构体大小也就等于各个变量的和。 #pragma pack(4)表示结构体内的内存必须按4个字节对齐。如果成员小于4个字节,则按顺序放下一个成员,除非剩余空间小于下一个成员。 来源: https://blog.csdn.net/weixin_42206078/article/details/101079278

C语言字节对齐分析

∥☆過路亽.° 提交于 2019-11-29 02:18:02
1、前言 什么是字节对齐呢?现代计算机中的内存空间都是按字节(byte)划分的,从理论上讲似乎任何类型的变量的访问都可以从任何地址开始,但是实际情况是在访问特定变量的时候经常需要在特定的内存地址进行访问,因此,就需要各种类型数据按照一定的规则在空间上排列,而不是顺序地一个接一个地排放,这就是字节对齐。 2、字节对齐的好处 各个硬件平台对存储空间的处理上有很大的不同,一些平台对某些特定类型的数据只能从某些特定的地址开始存取,比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构上编程必须保证字节对齐。其它平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失,例如某些平台每次读都是从偶地址开始,如果一个int类型(32位系统)变量存放在偶地址开始的地方,那么一个读周期就可以读出32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果进行高低字节的拼凑才能得到该32bit数据。 3、对齐的准则 有四个重要的基本概念,如下: (1)数据类型自身的对齐值:char类型数据自身对齐值为1字节,short类型数据为2字节,int/float类型数据为4字节,double类型数据为8字节; (2)结构体或类的自身对齐值:其成员中自身对齐值最大的哪个值; (3)指定对齐值:#pragma pack

关于arm 的字节对齐

[亡魂溺海] 提交于 2019-11-29 01:44:18
一.什么是 字节对齐 ,为什么要对齐?   现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。   对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit数据。显然在读取效率上下降很多。 二.编译器是按照什么样的原则进行对齐的?   先让我们看四个重要的基本概念:   1.数据类型自身的对齐值:对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,单位字节。   2.结构体的自身对齐值

第35月第18天 bmp对齐

这一生的挚爱 提交于 2019-11-27 18:58:44
1. #pragma pack(push,1) typedef struct tagBITMAPFILEHEADER { uint16_t bfType; uint32_t bfSize; uint32_t bfReserved; uint32_t bfOffBits; } BITMAPFILEHEADER; typedef struct tagBITMAPINFOHEADER { uint32_t biSize; int32_t biWidth; int32_t biHeight; uint16_t biPlanes; uint16_t biBitCount; uint32_t biCompression; uint32_t biSizeImage; int32_t biXPelsPerMeter; int32_t biYPelsPerMeter; uint32_t biClrUsed; uint32_t biClrImportant; } BITMAPINFOHEADER; #pragma pack(pop)    按照上面的代码写出来的文件,文件图片打开失败,说文件破损。 后来才发现BMPFILEHEADER_T这个数据接口的内部变量排序,并没有4字节对齐,导致sizeof(BMPFILEHEADER_T)比预想的大! 所以直接用宏设置数据结构的字节对齐方式为:1字节对齐。

#pragma pack(push) 和#pragma pack(pop) 以及#pragma pack()

点点圈 提交于 2019-11-27 14:07:43
我们知道结构体内存对齐字节可以通过#pragma pack(n) 的方式来指定。 但是,有没有想过一个问题,某些时候我想4字节对齐,有些时候我又想1字节或者8字节对齐,那么怎么解决这个问题呢? 此时,#pragma pack(push) 和#pragma pack(pop) 以及#pragma pack()应运而生。 看测试代码: ( 说明,64位GCC,默认8字节对齐) 屏蔽了的代码先别看,只看这个结构体,在默认8字节对齐的方式下,sizeof大小为24个字节,这不再做分析,之前随笔分析过了。 然后我加上强制4字节对齐之后: 那么现在,我再新建一个结构体B,内容和结构体C一样,只是对齐方式向分别采取不同的方式: #include <stdio.h> #pragma pack(4) struct C { double d; char b; int a; short c; }; #pragma pack() struct B { double d; char b; int a; short c; }; 像上面那样处理之后,输出:先打印结构C,再打印结构B 这说明了,在强制4字节对齐之后,我加上#pragma pack() ,能够让程序恢复默认对齐(这里是8字节)状态。 #pragma pack() 能够取消自定义的对齐方式,恢复默认对齐。 继续测试: #pragma pack(4)