Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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++_Arrays_Performance - Fatal编程技术网

C++ 内部函数:从数组复制值或按索引重复访问

C++ 内部函数:从数组复制值或按索引重复访问,c++,arrays,performance,C++,Arrays,Performance,我对访问函数内部阵列时的效率/性能有疑问。 假设我有一个函数,它在一个包含5000个元素的数组中循环。在该函数中,我在索引X[k]处多次访问数组X 从性能角度来看,将索引k处的值分配给循环中的临时变量(例如tmpVal=X[k])是否有利?换句话说,我可以通过避免反复访问同一位置的数组来提高执行速度吗? 多谢各位 在我看来,只有当您需要在每个实例上保留任何特定索引的值并为将来的实例覆盖该值时,才需要为索引分配一个时态变量。否则,在执行时,数组执行仍然尽可能快且高效。它确实可以节省大量数组值循环的

我对访问函数内部阵列时的效率/性能有疑问。 假设我有一个函数,它在一个包含5000个元素的数组中循环。在该函数中,我在索引
X[k]
处多次访问数组
X

从性能角度来看,将索引k处的值分配给循环中的临时变量(例如
tmpVal=X[k]
)是否有利?换句话说,我可以通过避免反复访问同一位置的数组来提高执行速度吗?


多谢各位

在我看来,只有当您需要在每个实例上保留任何特定索引的值并为将来的实例覆盖该值时,才需要为索引分配一个时态变量。否则,在执行时,数组执行仍然尽可能快且高效。它确实可以节省大量数组值循环的时间在内部,除非您确切知道要访问的值及其索引,但如果不是全部都很好,那么请允许我在前面说,您试图实现的充其量只是一个微优化,并且您应该专注于使代码易于遵循,而不是试图挤出额外的性能

实际上,以下各项之间几乎没有区别:

  • 通过索引访问数组中的元素,以及
  • 访问堆栈上的副本
  • 由于智能地使用了处理器的片上缓存,第一次访问阵列元素时,它将被复制到缓存中,并从缓存中进行非常快速的访问


    如果您确实创建了一个临时副本,那么您正在将对象复制到一个新位置,这将比简单地访问阵列中的对象更昂贵(可能)。

    您测量过吗?首先尝试(在最高优化级别),并测量差异。尽管如此,还是有一种叫做缓存的东西。只要您的变量不是限定的
    volatile
    ,编译器就应该能够比您更好地进行优化。不过,还是先量一下。不,我还没量过。但我马上就去。我想可能有一些经验法则。谢谢你!已经谢谢你了。通过指针传递双精度值与通过值传递双精度值作为函数参数是否也是微优化的一个示例?@mscnvrsy-很高兴我能提供帮助。是的,通过指针传递double也将是一个微观优化。事实上,这很可能让事情变得更糟!双精度的大小通常为8字节(64位),与x64 PC上的指针(也是64位)完全相同。这意味着无论您是通过指针传递,还是传递副本,您总是将8个字节复制到函数中。但是,如果使用指针,您的函数将需要取消对它的引用,这将意味着需要更长的时间!