-4

我需要对我从经验中发现的东西作出解释。我有一个非常大的字符类型的平面数组。该数组总共有 500x500x500 = 125E+6 字节长。在单元格内,我保留了一个介于 0 和 255 之间的数字。但幸运的是,在遍历数组时,我只对具有非零值的单元格感兴趣!

现在问题来了。我通过实验发现,在遍历整个零和非零数组时,即使对单元格进行最小的操作也会花费大量时间,而如果我使用类似于下面的条件,

while( index < 125000000 )
{
    if( array[ index ] > 0 )
    {
        // Do some stuff
    }

    index++;
}

执行时间大大缩短。事实上,我可以在几秒钟内遍历整个数组并在非零单元格上执行我的操作,而不是在没有条件的情况下执行半小时的方法。

我需要的是解释为什么会这样!我需要在我的论文报告中解释这种现象,如果我能与一篇科学论文或类似论文相关,那将是最好的。

先感谢您!

最好的问候, 奥米德·阿里扬

4

1 回答 1

2

可能是您希望您char是无符号的,因此能够在 [0,255] 范围内保存值,但实际上它是有符号的,在 [-128, 127] 范围内保存值(假设二进制补码)。因此,情况的数量array[ index ] > 0比您预期的要小得多,因为所有分配值大于的元素127都将具有负值。

请注意,您声称要检查非零值,但实际上是在检查正值。

char您可以在您的平台上检查范围:

#include <limits>
#include <iostream>

int main()
{
  std::cout << static_cast<int>(std::numeric_limits<char>::min()) << std::endl;
  std::cout << static_cast<int>(std::numeric_limits<char>::max()) << std::endl;

  char c = 234;
  std::cout << static_cast<int>(c) << std::endl; // 234 if unsigned, -22 if signed
}
于 2013-08-28T11:11:10.277 回答