增量挑战:++对+1
Increment challenge: ++ vs. +1
当我被卡住时,我正在缓存上练习,我开始怀疑一元增量++和+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)
被分配在地址0xA0000000
的RAM中,而第一个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(它是黑色的,这是灰度图像),那么使用这两个代码有多少次未命中和命中(以及为什么)?使用这两种不同的代码有区别吗?
我想说至少有两次未命中,因为在这两种情况下,首先程序必须执行img.getVal(x,y)
,这会导致未命中,填充缓存中的一行并将值0返回给CPU,然后是h[img.getVal(x,y)]
,这也会返回未命中,这是因为缓存中还不包含任何与h数组相关的信息。但是,接下来会发生什么呢?我们现在在缓存中有h[0]
的值,我们需要增加它。我认为使用上面的两个代码有区别。
干杯,
Marco
编辑:这不是指任何特定的编译器。我想知道这是怎么回事。(练习在纸上)
如果我们假设img.getVal(x,y)
每次都返回相同的值,那么这两个代码片段应该是相同的。当然,如果不确切地知道img.getVal(x,y)
是如何实现的,我们就不能说。
至于这行代码生成的命中和未命中次数,将完全取决于代码入口的缓存状态,以及代码是否被中断等。但是,如果这行代码是孤立运行的,缓存为空,没有中断,那么它是一次未命中(用于读操作)和一次命中(用于写回更新值)。但这并没有考虑到img.getVal(x,y)
的所有者——我不知道,因为您没有显示该代码。
- 你能帮我解决删除数组 c++ 中重复值的挑战吗?
- 如何改进我的代码,使其不会因超时而终止?(黑客排名挑战)
- 玩数字编程挑战(子数组的平均值)
- 电话价格问题(十月挑战代码厨师)
- 为什么针对给定挑战的此解决方案不起作用?
- 无法在代码厨师七月挑战中找到我的逻辑错误
- 为什么这段代码只输出" "?(Codeingame的雷神挑战)
- 改进我的代码以应对C++的挑战,新手在这里
- 我需要对这个代码部队挑战 784F 进行哪些更改
- 基本派生的类成员覆盖.挑战活动11.3
- 对操作员限制的代码挑战的无效解决方案
- 在初学者编码挑战中麻烦
- 需要在O(n)复杂性中解决的数组编码挑战
- 解决黑客等级" Summing the N series"挑战
- 尝试解决HackerBank上的BFS挑战时出现错误的alloc异常
- 我如何在AI挑战行星战争中运行四个机器人
- 应对"Find the first repeated character in a string"挑战的最紧凑、高效、可读和智能的解决方案
- 程序挑战的正确答案百分比
- 欧拉计划挑战3:找到大数的最大素因数
- 我需要帮助来理解编程挑战