各位朋友,大家好!小编整理了有关为什么要内存对齐的解答,顺便拓展几个相关知识点,希望能解决你的问题,我们现在开始阅读吧!
有经验的C语言程序常说的“内存对齐”,原因究竟是什么
前面提到 CPU 每次访问数据的宽度是一个字,如果C语言程序中的数据总是内存对齐的,那么 CPU 访问数据总是原子性的,这对于许多无锁数据结构和其他并发需求的正确操作至关重要。
因为内存对齐。为了CPU更快地寻址,编译器会进行内存对齐。
性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。 每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。
首先让把他们的地址打印出来看个究竟,这是打印出来的结果:a=0x00000000,b=0x0000002,c=0x00000004,d=0x0000000 很奇怪吧,不像我们预想的那样,他们是按顺序存储的。这就涉及到一个内存排列的问题:内存对齐。
对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的。
内存对齐的规则
struct1 的所需内存变成了 28 。最大8字节的整数倍应为 32 。结构体 struct2 填充到 29 就结束了,但是结构体需满足 内存对齐 原则。
为了加快计算机的取数速度,编译器默认对内存进行字节对齐。
内存地址 访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。
这样就产生了数据对齐的规则,也就是将数据尽量的存储在一个步长内,避免跨步长的存储,这就是内存对齐。在32位编译环境下默认4字节对齐,在64位编译环境下默认8字节对齐。
数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
结构体变量中,int占多少字节?
解释:结构体中(注意变量定义的顺序),char 是1个字节,int 是4 个字节,结构体字节对齐:char 和 int对齐。所以将char补齐到4个字节。
int占4个字节。int是C语言中最基本的数据类型之一,表示整数。int类型在内存中占用了4个字节,也就是32位。
int占4个字节。int类型的大小在不同的计算机系统和编程语言中可能会有所不同,但在大多数现代计算机系统中,int类型通常占用4个字节(32位)的内存空间。在计算机中,整数类型用于存储整数数值,可以是正数、负数或零。
int占用4字节。在一般的电脑中,int占用4字节,32比特,数据范围为-2147483648~2147483647[-2^31~2^31-1];在微型机中,int占用2字节,16比特,数据范围为-32768~32767[-2^15~2^15-1]。
以上内容就是解答有关为什么要内存对齐的详细内容了,我相信这篇文章可以为您解决一些疑惑,有任何问题欢迎留言反馈,谢谢阅读。