-
我们在编程过程中经常会用到指针变量,如果需要知道指针变量的大小,我们也可以很方便的使用sizeof来查看,但是指针变量的大小究竟和什么直接相关呢?
-
首先,我们需要知道:指针变量其本质是指向一个地址的变量。我们可以将一段程序分为代码部分和数据部分。
-
代码部分的地址其实就是指令的地址,在底层中根据使用的CPU架构不同,可以是PC寄存器或者CS:IP形式的寄存器组合。对于使用高级语言的程序员(非汇编程序员)来说,这些寄存器都是透明的,我们无法直接操作指令地址实现任意跳转,只能通过函数调用(函数指针也是一种变量)的形式实现指令的跳转。
-
数据部分的地址其实就是变量的地址,这里需要区分变量大小和变量地址大小两个概念。变量大小根据程序员需要可以分配不同的字节数,比如char(1个字节),int(4个字节)等,而变量的地址大小分配,需要能够保证在变量可分配地址范围内的任何地方都能找到指向的变量。
-
而这个可分配的地址范围就是存储器范围大小。但要区分理论可寻址范围和实际可寻址范围,RAM的大小决定了变量的实际可寻址范围,为了良好的扩展性,理论可寻址范围(逻辑地址)决定了指针变量的大小。比如:在小型16位MCU中指针变量大小是2B(无虚拟存储系统),其存储大小是8~16k。在最新的64位架构的8G内存的CPU中(有虚拟存储系统),逻辑可寻址范围达2^64,指针变量大小可达8B,虽然实际内存只有8G。
-
总结:指针变量的大小由CPU当前运行模式(CPU不同运行模式的寻址架构不同)的逻辑寻址范围决定,即指令中的地址码位数。
指针变量的所占字节数大小确定
最新推荐文章于 2023-07-13 20:17:34 发布