原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。 为什么未对齐的内存,处理器需要作两次内存访问呢?见下图: 在32位机器下,一次可以访问4个Byte,假设不采用内存对齐的方式,int类型的变量前有一个char类型的变量c,那么处理器要完全访问到i,第一次需要先访问c变量以及i变量...
除了第一个结构体成员变量占用0位置处空间,其余成员变量都要按照对齐数来在内存中进行存放,在VS中成员变量的对齐数只要小于VS的默认对齐数,那么成员变量的对齐数就为他本身。 就拿上面代码的两个结构体举例,结构体S1,第一个成员c1,类型为char在0位置处占用一个字节的空间,第二个成员n,类型为int,小于默认对齐数8...
什么是内存对齐 还是用一个例子带出这个问题,看下面的小程序,理论上,32位系统下,int占4byte,char占一个byte,那么将它们放到一个结构体中应该占4+1=5byte;但是实际上,通过运行程序得到的结果是8 byte,这就是内存对齐所导致的。 //32位系统 #include<stdio.h> struct{ int x; char y; }s; int main()...
// 此结构体元素s1占用最大内存,因此对齐字节为8 // s1:元素开始位置为0,占用8个字节,结束字节是7 // s2:元素开始字节为8,占用10个字节,结束字节是17 // s3:元素开始字节为18,占用1个字节,结束字节为18(至此已占用19字节) // 因此整个结构体占用24 个字节(3*8=24) typedef struct _S2 { double s1...
编译器之所以要内存对齐,是为了更加高效的存取成员 c,而代价就是浪费了3个字节的空间。 除了结构体,变量也会进行内存对齐,请看下面的代码: #include<stdio.h>#include<stdlib.h>intm;charc;intn;intmain(){printf("&m: %X\n&c: %X\n&n: %X\n", &m, &c, &n);system("pause");return0;} ...
变量b是int类型,根据第二个规则,可得 对齐数 = (4 < 8) = 4,所以对齐到结构体内存地址为4的地址处 变量c是double类型,同上,可得 对齐数 = (8 = 8) = 8,所以对齐到结构体内存地址为8的地址处 从图中可以清晰看出,结构体每个变量的内存使用情况。现在结构体已经占用了16个字节,那么总结构体的大小为最...
这个对齐系数规定了所有int类型的变量默认情况下在内存中的地址必须是4的倍数(能被4整除)。也可以直接求得一个变量或者它的数据类型的对齐系数,比如下面的代码:#include <stdio.h> #include <stdlib.h> #include <stdalign.h> int main() { printf("char类型对齐系数:%d\n", alignof(char));printf("...
C语言编译器在处理代码时,常常会将一些变量的内存对齐,这其实主要是因为底层处理器的限制。对于多数处理器而言,每次访问的数据并不是越少越好:例如,有的处理器每次访问 4 个字节数据,要比访问 1 个字节数据效率高得多。 针对这样的情况,一些C语言编译器会将代码中的变量地址对齐,目的就是让处理器能够更加高效的访...
C 语言编程 — 内存对齐 内存对齐 计算机的内存空间都是按照字节划分的,元素(包括:变量、结构体成员、共用体成员)会按照定义的顺序一个一个放到内存中。从理论上讲,似乎可以从任意地址开始存储任何类型的元素,但实际上元素之间并不是紧密排列的。因为计算机系统对于基本数据类型在内存中的存放位置是有限制的:假设一...