当我被卡住时,我正在练习缓存练习,我开始想知道一元增量 ++ 和 +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 中的 address 处分配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
假设我们正在访问像素(0,0),因此x = 0,y = 0,并且像素(0,0)的值为0,那么使用这两个代码有多少未命中和命中(以及为什么) (它是黑色的,这是灰度图像)?使用这两个不同的代码有区别吗?
我会说至少有 2 次未命中,因为在这两种情况下,首先程序必须执行img.getVal(x,y)
,这会导致未命中,在缓存中填充一行并将值 0 返回给 CPU,然后h[img.getVal(x,y)]
返回未命中同样,因为缓存还没有包含与 h 数组相关的任何信息。但是,接下来会发生什么?我们现在在缓存中的值,h[0]
我们需要增加它。我认为这里使用上面的 2 个代码存在差异。
干杯,
马可
编辑:这不是指任何特定的编译器。我想知道这是如何工作的。(练习在纸上)