当我被卡住时,我正在对缓存进行练习,我开始怀疑一元增量++和+1操作之间的区别。

我有以下代码行(我们称其为 CODE1 ):

h[img.getVal(x,y)]++;

这与编写以下代码相同吗?(我们称它为 CODE2 )
h[img.getVal(x,y)]=h[img.getVal(x,y)]+1;

很明显,它们在宏观效果方面是相同的(它们都增加了1 h[img.getVal(x,y)]),但是,它们真的一样吗?
我想知道这是由于缓存。

假设我们有一个直接映射的缓存,并且第一个pixel(0,0)分配在RAM的地址0xA0000000上,而第一个h[0]分配在0xB0000000上。
假设有6位偏移,10位索引和16位标签,我们会遇到这种情况:

二进制格式的0xA0000000是:
--------TAG---------|---INDEX----|-OFFSET
1010 0000 0000 0000 |0000 0000 00|00 0000

二进制中的0xB0000000是:
--------TAG---------|---INDEX----|-OFFSET
1011 0000 0000 0000 |0000 0000 00|00 0000

使用2个代码,有多少未命中和命中(和WHY ),假设我们正在访问pixel(0,0),因此x = 0,y = 0,并且pixel(0,0)具有一个值为0 (黑色,这是灰度图像)?使用这两种不同的代码有区别吗?

我会说至少有2个未命中,因为在两种情况下,程序首先都要执行img.getVal(x,y),这会导致未命中,将行填充到缓存中并将值0返回给CPU,然后返回h[img.getVal(x,y)]并返回也会错过,因为缓存尚未包含与h数组有关的任何信息。
但是,那会发生什么呢?
现在,我们在缓存中具有h[0]的值,我们需要对其进行递增。我认为这里使用上面的2代码有区别。

干杯,

马可

编辑:并未引用任何特定的编译器。我想知道这是如何工作的。 (练习在纸上)

最佳答案

如果我们假设img.getVal(x,y)每次都返回相同的值,则这两个代码段应该相同。当然,在不确切知道如何实现img.getVal(x,y)的情况下,我们不能说。

至于这一行代码会产生多少次命中和遗漏,将完全取决于代码入口处的缓存状态,代码是否被中断等。是孤立运行的,缓存为空且无中断,这是一次未命中(用于读取操作)和一次命中(用于更新值的回写)。但这没有考虑到wnatever img.getVal(x,y)的影响-我不知道,因为您没有显示该代码。

关于c++ - 增量挑战:++与+1,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17681801/

10-11 03:11