内存对齐

内存对齐的三条原则

怎甘沉沦 提交于 2019-11-30 12:26:39
1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。 2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.) 3:收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐。 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]   

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

前端复习之HTML5

送分小仙女□ 提交于 2019-11-30 03:24:53
HTML5 Day01: *概念: *HTML5之后,声明不在出现版本信息 *HTML5永远不可能离开JavaScript。 *HTML5在移动端支持好于PC端 * HTML新表单: *input新类型: 1 *email类型 - 验证是否包含“@” 2 *url类型 - 验证是否包含"http://" 3 *tel类型 - 只在移动端显示 4 *number类型 5 *range类型 6 *date类型 7 *color类型 *表单新元素: 1 *datalist元素 - 类似于select元素 2 *datalist元素 - 预定义数据内容(option) 3 *使用<input>元素的list属性 4 *prograss元素 - 进度条 5 *max - 设置最大值 6 *value - 设置当前进度 7 *meter元素 - 刻度 8 *min、max - 最小最大值 9 *value - 设置当前值 10 *low - 设置低预警 11 *output元素 *表单新属性: 1 *placeholder - 提供默认提示内容 2 *multiple - 允许输入多个值,多个值之间使用"," 3 *autofocus - 自动获取焦点 4 *form - 允许表单元素定义在表单之外 *表单新验证 *验证属性: 1 *required属性 2 *验证当前元素值是否为空 3

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.结构体的自身对齐值

内存对齐

你。 提交于 2019-11-28 18:02:24
1,结构体中内存的对齐 #include "pch.h" #include <iostream> struct Test { int a; // 4 short b; // 2 char c; // 1 double d; // 8 }; int main() { Test t; t.a = 100; t.b = 200; t.c = 'c'; t.d = 10.11; printf("sizeof(Test) = %d\n",sizeof(t)); std::cout << "Hello World!\n"; } 将结构体中数据位置换一下: #include "pch.h" #include <iostream> struct Test { int a; // 4 double d; // 8 short b; // 2 char c; // 1 }; int main() { Test t; t.a = 100; t.b = 200; t.c = 'c'; t.d = 10.11; printf("sizeof(Test) = %d\n",sizeof(t)); std::cout << "Hello World!\n"; } 2,结构体中含有结构体的内存对齐 3,含有位域的内存对齐    每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。

#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)

sizeof和sizeof(string)的问题

╄→尐↘猪︶ㄣ 提交于 2019-11-27 13:50:01
今天看《程序员面试宝典》一书(为了应付将要到来的微软笔试),看到了sizeof(string)这个问题。在Dev C++上测试的结果是4,很不明白。上网搜了一下,得到如下结果: string strArr1[]={"Trend", "Micro", "Soft"}; sizeof(strArr1)=12 转自: http://apps.hi.baidu.com/share/detail/30398570 关于sizeof(string),今天看那本面试宝典的时候看到这个表达式,有点吃惊,书上写着sizeof(string)=4;当时很纳闷,难道分配4个字节大小的内存给string吗?查阅了相关资料得出结论: string的实现在各库中可能有所不同,但是在同一库中相同一点是,无论你的string里放多长的字符串,它的sizeof()都是固定的,字符串所占的空间是从堆中动态分配的,与sizeof()无关。 sizeof(string)=4可能是最典型的实现之一,不过也有sizeof()为12、32字节的库实现。 但是VC6.0测试后sizeof(string)=16.还是跟编译器有关 #include<iostream> using namespace std; void main(void) { string a[] = {"aaaaa","bbbb","ccc"}; int x =

C语言中的内存对齐

二次信任 提交于 2019-11-27 06:22:00
什么是内存对齐 内存对齐”应该是编译器的“管辖范围”。编译器为程序中的每个数据单元安排在适当的位置上。 出现原因( 老生常谈的两句话 ) 平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。 性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。 对齐规则 第一个成员放在偏移量(offset)为0的地方。 以后的每个成员的偏移量: min(#pragma pack()指定的数值,当前成员的大小) 的倍数中。 每个成员对齐后,本身也要对齐,整体的偏移量:min(#pragma pack()指定的数值,结构体最大数据成员的大小)。 关于 #pragma pack 通过 #pragma pack(n) 来设定变量以n字节对齐方式 n字节对齐就是说变量存放的起始地址的偏移量有两种情况 如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式 。 果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式 。 32位系统默认为4,64位系统默认为8。 举个例子🌰 #include<stdio.h> #pragma pack(4) struct Node{ char a;