2010-11-08 52 views
1

被修改傳遞:請注意,當我提到的性能比較,它不是C的性能比較++傳遞通過引用對通過噪聲值。當CPLEX對象按值傳遞或通過引用傳遞時,測試CPLEX的基礎算法(用於解決線性程序)是否運行更好。的功能相同的不同在參數類型 - 通過值/參考

您好所有:

我需要時,函數的參數是按值(PBV),當同樣的函數的參數通過引用(PBR)通過傳遞給測試程序的性能。我正在使用一個庫(IBM ILOG CPLEX,用於與Operations Research/Linear Programming相關的工作),該庫中的類對象可以是PBV和PBR,根據庫的手冊,不幸的是,其他。我只想測試一個選擇是否會導致性能問題。

蠻力的方式來測試這可能是有兩個源代碼文件,source_pbv.cpp和source_pbr.cpp,其中前者具有所有功能PBV和後者具有所有功能PBR。這很難保持。我想知道,如果可以的話,我可以使用一個.cpp文件來測試性能。

例如,在頭文件,可我定義類似

#define PBV 0 //0 value here indicates I want to PBR, 1 value here indicates I want to PBV 

一旦被定義,有點像在函數聲明部分下列有效?

#if PBV == 0 // I want to PBR 
    function_to_call(Class1& class1object);//PBR function declaration 
#elif PBV == 1 // I want to PBV 
    function_to_call(Class1 class1object);//PBV function declaration 
#endif 

然後,在源代碼中,我可以簡單地具有

function_to_call(class1object); 

和此呼叫是否轉化爲PBV或PBR將取決於#定義PBV我在標題部分。

如果這不是正確的道路要走,任何指向正確的方向將高度讚賞。

而且,如果這種方式是體面的,我豈不要指定在我的代碼的身體下面:

function_to_call(Class1& class1object){//Actual function details for PBR 
    //Stuff 
} 

function_to_call(Class1 class1object){//Actual function details for PBV 
    //Stuff 
} 

與正在重複兩次//東西?有沒有辦法可以避免這種情況?

謝謝。

+0

您不必對引用進行空檢查。 – DumbCoder 2010-11-08 12:53:47

+0

它應該可以正常工作。你試過了嗎?告訴我們是否有任何問題。 – 2010-11-08 12:53:53

+0

[這裏](http://stackoverflow.com/questions/2139224/how-to-pass-objects-to-functions-in-c)是一些可能會幫助你決定的指針。 – 2010-11-08 12:55:12

回答

0

這裏是我工作...

#define PBV 0 //0 means PBR, 1 means PBV 
#if PBV == 0 
    #define PCLASS1 Class1& 
#elif PBV == 1 
    #define PCLASS1 Class1 
#endif 

void function_to_call(PCLASS1 class1object){ 
//depending on PBV, PCLASS1 above will be either Class1& or Class1 
    //Stuff 
} 

這樣,我不必在兩個函數中擁有// Stuff。我只需要在一個位置更改我的代碼以在PBR和PBV之間切換。

感謝您的幫助。

4

您的解決方案似乎正常,但它不會讓你在一次運行測試PBV VS PBR(從一個「模式」切換到另一個需要重新編譯)。另一個解決方案是將function_to_call的參數類型作爲模板參數。結果基本相同,但您可以從代碼中調用function_to_call<Class1>(PBV)和function_to_call<Class1 &>(PBR),並讓編譯器實例化兩個版本。

+0

嗯......如果我按照我在原文中提到的方式,我意識到我真的無法解決完全定義function_to_call(Class1&class1object){// Stuff //}並重復相同的// Stuff // // function_to_call(Class1 class1object){// Stuff //}。這(不必要地重複// Stuff //)正是我最初不想做的事情。也許你提到的模板參數是防止重複// Stuff //在兩個函數內重複的方法,這兩個函數只在參數列表中有所不同。我會研究這一點。謝謝。 – Tryer 2010-11-08 16:10:35

1

另一種可能性(即需要重新編譯)是使用typedef小號