Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 当循环迭代次数不是常数时,分支预测器能完美地预测吗?_C_Assembly_X86_Branch Prediction - Fatal编程技术网

C 当循环迭代次数不是常数时,分支预测器能完美地预测吗?

C 当循环迭代次数不是常数时,分支预测器能完美地预测吗?,c,assembly,x86,branch-prediction,C,Assembly,X86,Branch Prediction,下面的代码会对英特尔Core i7造成分支预测失误惩罚吗 for(i = 0, count = *ptr; i < count; i++) { // do something } for(i=0,count=*ptr;i

下面的代码会对英特尔Core i7造成分支预测失误惩罚吗

for(i = 0, count = *ptr; i < count; i++) {
    // do something
}
for(i=0,count=*ptr;i

计数可以是0、1或2。

如果计数随机变化,则无法预测循环条件。如果它以某种模式运行——比方说重复0,1,2,1——它可以在core2或i7上完美预测。对于其他模式,这取决于


有关更详细的解释,请参见“分支预测”一章。

没有足够的迭代次数使其成为可预测的,因为那里的代码太少,所以没有意义。如果在外部循环中多次执行此操作,您可能希望说服编译器展开循环(或手动展开循环),以便它可以使用条件指令。如果循环保证至少进入一次,该怎么办?这是否给了分支预测器足够的时间来识别由其中一个寄存器的值决定的迭代次数?分支预测器不是这样工作的。它还没有检查寄存器的值。