1.什么是内存对齐?内存对齐有什么意义?2. 请简述C++中函数调用过程并解释栈帧的概念。

Posted 顾文繁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1.什么是内存对齐?内存对齐有什么意义?2. 请简述C++中函数调用过程并解释栈帧的概念。相关的知识,希望对你有一定的参考价值。

什么是内存对齐?

现代计算机中内存空间都是按照 byte 划分的,从理论上讲似乎对任何类型的变量的访问可
以从任何地址开始,但是实际的计算机系统对基本类型数据在内存中存放的位置有限制,
它们会要求这些数据的首地址的值是某个数k(通常它为4或8)的倍数,这就是所谓的内存对齐。

为什么要进行内存对齐

尽管内存是以字节为单位,但是大部分处理器并不是按字节块来存取内存的。它一般会以
双字节,四字节,8字节,16字节甚至32字节为单位来存取内存,我们将上述这些存取单位称
为内存存取粒度。
假如没有内存对齐机制,数据可以任意存放。使用内存对齐,处理器在取数据时一次性就能将数据读出来了,而且不需要做额外的操作,提高了效率。有利于减少cpu访问次数,
使程序运行的快。

(1)ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。

(2)EBP:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。

C++中函数调用过程

假设函数A调用函数B,我们称A函数为"调用者",B函数为“被调用者”则函数调用过程可以这么描述:

  (1)先将调用者(A)的堆栈的基址(ebp)入栈,以保存之前任务的信息。

  (2)然后将调用者(A)的栈顶指针(esp)的值赋给ebp,作为新的基址(即被调用者B的栈底)。

  (3)然后在这个基址(被调用者B的栈底)上开辟(一般用sub指令)相应的空间用作被调用者B的栈空间。

  (4)函数B返回后,从当前栈帧的ebp即恢复为调用者A的栈顶(esp),使栈顶恢复函数B被调用前的位置;然后调用者A再从恢复后的栈顶可弹出之前的ebp值(可以这么做是因为这个值在函数调用前一步被压入堆栈)。这样,ebp和esp就都恢复了调用函数B前的位置,也就是栈恢复函数B调用前的状态。

栈帧

栈帧也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。
简言之,栈帧就是利用EBP(栈帧指针,请注意不是ESP)寄存器访问局部变量、参数、函数返回地址等的手段。

以上是关于1.什么是内存对齐?内存对齐有什么意义?2. 请简述C++中函数调用过程并解释栈帧的概念。的主要内容,如果未能解决你的问题,请参考以下文章

结构体内存对齐

什么是对齐内存分配?

Golang优化之内存对齐

深度剖析结构体@自定义类型1---结构体的声明,自引用,变量定义和初始化 + 结构体内存对齐 + 结构体传参 + 结构体实现位段

C语言:内存字节对齐详解

c/c++内存对齐详解