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



汇编下call和ret指令是否有内存屏障的作用? 第1页

  

user avatar   bei-ji-85 网友的相关建议: 
      

首先,线程安全和乱序不是一回事。

线程安全更强调的是cache的一致性,而你说的这个是乱序,乱序并不会破坏实际运行结果

乱序的意义在于:如果有两条互相不干扰的指令,那么CPU可能会对实际的指令执行进行重排,但这种重排多数只是在局部意义上,call指令如果分支预测失败,流水线就直接被清空的,原来重排的结果自然不会被保留。

指令重排(乱序)是指在不干扰实际执行结果的情况下的重排,来实现加速,如果在语义明确的情况下重排导致结果不一致,那是硬件bug

具体到你说的new的问题,new的实现在汇编层面上十分巨大,已经超越了乱序的范畴了,一次发射几百条汇编指令的CPU目前是不存在的,所以你用这段汇编来表达对new实现的疑惑是不对的。

硬件层面上来看,call指令操作的内存只会写入到多核的某一个核心的L1 cache上,并不会通告给其它的核,除非是显式的调用mfence这类指令。new的线程安全指的是你new出一个对象以后,这个对象分配的内存区域是确定的,不会被分配给其它对象,但对于new出对象里的构造函数来说,new不保证内部的操作一定是安全的,因为这部分代码是用户自己写的,构造函数里如果非要访问一个未保护的对象,new本身不能保证任何东西。

-----------------------------

题主对C++的实现理解也有问题,题主认为构造函数是在new的过程中发生的,从语言层面上可以这么理解(具体不了解规范的定义,我对C++不熟),但从汇编层面上,C++的实现是先new,然后再调构造函数,所以根本不存在new的过程中初始化数据的问题。

汇编层面上:先是调用operator new,分配好内存以后返回,再调用构造函数,这已经明显是两步了。




  

相关话题

  当下软件开发语言腾出不穷,作为老牌c++GUI领域top1的QT未来会怎样? 
  开发桌面软件时,如何使用 Mac 上那种扁平化极简风格的 UI? 
  多用组合少用继承中,接口继承算不算一种组合? 
  一颗现代处理器,每秒大概可以执行多少条简单的MOV指令,有哪些主要的影响因素? 
  自己动手组装主机时,为什么大部分人说 AMD使用过程比英特尔更难搞,不适合小白? 
  c++中 为什么数组不能被vector完全替代? 
  游戏程序员必须要修 C# 吗?我徘徊在先开始 C++ 还是 C# ? 
  为什么一些人很瞧不起 Java? 
  C++的move构造是否是设计失败的? 
  CS:IP寄存器多任务模式下是怎么设置的? 

前一个讨论
多核cpu多线程同时执行cmpxchg指令会发生什么?
下一个讨论
三国时期的历法是怎样的?其影响有哪些?





© 2025-05-29 - tinynew.org. All Rights Reserved.
© 2025-05-29 - tinynew.org. 保留所有权利