@
bruce0 哦对用机器码也不保险。
如果你用的是通用芯片,现代通用芯片在机器码的下面都有很多你“控制不了”的行为。比如英特尔的芯片微指令,一个机器指令其实是拆成若干指令,然后在芯片上有指令流水线(同一瞬间其实有多个指令的不同步骤正在执行)。这些指令“并行”会导致一些 data harzard 。当然,芯片帮我们处理好了。
但是因为是并行流水线所以会带来一些其他问题。比如遇到条件判断,现代芯片都会猜测这条语句的结果,然后提前进入某个分支执行。如果猜错了就“回滚”。对,分值预测就会导致你“执行时间不可控”。
还有比如 cacheline 、L1~L3 cache,atomic 指令,store buffer queue (在一个核上非 atomic 指令更新数据,另一个核不一定马上能看到)。这些都是你“不可控”的抽象。
----
现代计算机就是在一层一层你不可控的抽象上建立起来的。C++ 的各种语法和芯片上的这些复杂机制并没有本质差别。要理解、掌握这些抽象后面的原理,利用这些抽象才对嘛。