簡體   English   中英

在C ++中交換2D雙數組

[英]Swap 2D Double Arrays in c++

我有以下方法在c ++中交換兩個雙精度數組(double **)。 對代碼進行概要分析,該方法占運行時的7%...我認為這應該是一種低成本的操作,有什么建議嗎? 我是C ++的新手,但我希望只是交換對數組的引用。

 62 void Solver::Swap(double** &v1, double** &v2)
 63 {
 64         double** vswap = NULL;
 65         vswap = v2;
 66         v2 = v1;
 67         v1 = vswap;
 68 }

1)確保內聯函數。

2)您可以就位交換,例如使用XOR

3)嘗試強制編譯器使用寄存器而不是堆棧來傳遞參數(即使x86上的寄存器壓力很大,也值得嘗試)-您可以使用標准的register關鍵字或在MS編譯器上使用fastcall

typedef double** TwoDimArray;

class Solver
{
  inline void Swap( register TwoDimArray& a, register TwoDimArray& b )
  {
    a ^= b ^= a ^= b;
  }
};

4)不要為vswap臨時vswap提供默認值。

代碼看起來不錯。 它只是一個指針分配。 這取決於調用該方法的次數。

我猜您的探查器在這里有點困惑,因為此方法實際上只交換兩個指針,這非常便宜。 除非調用此方法很多 ,否則它不應顯示在配置文件中。 您的探查器是否告訴您此方法被調用的頻率?

交換時您必須了解的一個問題是,一個數組可能位於緩存中,而另一個數組則不在(尤其是如果它們很大),因此不斷交換指針可能會破壞緩存,但是這會以一般的慢速方式顯示-下。

您確定配置了完全優化的代碼嗎?

您應該inline此函數。

除此之外,我看到的唯一一件事是,您首先將NULL分配給vswap然后立即分配一些其他值-但這應該由優化程序來處理。

 inline void Solver::Swap(double** &v1, double** &v2)
 {
   double** vswap = v2;
   v2 = v1;
   v1 = vswap;
 }

但是,為什么不使用std::swap()呢?

不要假設7%表示這種操作很慢-這取決於其他人是怎么回事。

您可以執行一項僅需1納秒的操作,而無需執行其他任何操作即可使其花費近100%的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM