百科问答小站 logo
百科问答小站 font logo



c++指针有啥优越性啊,什么情况下要用指针呐,大一初学有点不懂。? 第1页

  

user avatar   haozhi-yang-41 网友的相关建议: 
      

好像之前我答过:指针的本质就是CPU非直接寻址的一种抽象。

例如说最简单的寄存器间接寻址:

       MOV  EAX, [EBX]     

大概就类似于:

       //register int* ebx = 0x..... int eax = *ebx;     


而更复杂一点的变基寻址:

       MOV  EAX, [EBX20] 或者 MOV  EAX, [EBXESI]     

则类似于:

       //register int* ebx = 0x..... int eax = ebx[5]; 或者 //register int esi = 5 int eax = ebx[esi];     


更复杂的相对基址、比例基址就不说了,反正都是一个思路。


所以,如果要简单回答,那么就是:因为CPU就是这么工作的。我们广泛的用指针,只是为了迁就CPU,让它跑得更快,空耗更少,从而在整体上看,程序的性能就更好。而所有宣称没有指针的编程语言,要么是改了个概念(引用),要么干脆就对高性能运算放弃治疗(各种脚本)。


更根本的原因是:CPU本质上就是一堆高级的、复杂的物理电路。实际上非常非常的笨,非常非常的死板。而且研发成本极高、升级速度极慢、生产成本采购成本都很高。所以,当面对现实工作中千奇百怪的数据、以及它们的组织方式、存储方式、逻辑结构都(从CPU角度看上去)“毫无章法”的时候,CPU是没有办法去一一适应的。所以,它必然需要一种统一的、间接的、灵活的方式去解决这个问题,要不然CPU就拿不到实际数据进行计算了。而指针(或者从CPU来看——间接寻址),就是这么一种解决方案。

所以,实际上把实际执行的指令反汇编之后就会发现,除了极少数可以在编译期直接计算出来的寻址可以用直接寻址外,其他的大都是间接寻址。甚至很多看上去不是指针的操作——例如说局部变量,实际上编译出来的结果,也是通过ebp/rbp为基址的间接寻址操作。

实际上类似于:

       //你写的代码: int a = 10; int b = 20; //实际编译后的代码: ebp[5] = 10; ebp[6] = 20;     




  

相关话题

  请问c++中到底存不存在对指针类型的判断? 
  qt5.5中给全零地址发送udp数据包为何会失败? 
  如何理解互斥锁、条件锁、读写锁以及自旋锁? 
  怎么给设备加个usb口读其他设备上数据? 
  C++对比其他语言到底难在哪里?有人对C++异常推崇,除了性能优势,还有什么优点,怎么学好C++? 
  是 C++ 的发展进入了邪路,还是我写代码的姿势不正确? 
  指向指向指向指针的指针的指针的指针有什么用? 
  对同一个套接字,在两个线程中都对其调用recv函数,需要对其互斥保护吗? 
  有哪些值得学习的国内 c++ 开源项目? 
  如何评价网易校招C++的笔试题? 

前一个讨论
C/C++编译器在什么情况下不会重排语句?
下一个讨论
如何看待蜜雪冰城违法雇佣童工被罚 1.25 万元?企业违法雇佣童工需要承担哪些法律责任?





© 2025-06-15 - tinynew.org. All Rights Reserved.
© 2025-06-15 - tinynew.org. 保留所有权利