参数类型不同的相同函数 - 通过值/引用传递

时间:2010-11-08 12:46:53

标签: c++

编辑:请注意,当我提到性能比较时,不是C ++传递引用与传值的性能比较。当CPLEX对象按值传递或通过引用传递时,更多的是测试CPLEX的基础算法(解决线性程序)是否运行得更好。

大家好:

当函数的参数通过值(PBV)传递时以及通过引用传递相同函数的参数(PBR)时,我需要测试程序的性能。我正在使用一个库(IBM ILOG CPLEX,用于运算研究/线性编程相关工作),根据库的手册,该库中的类的对象可以是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将取决于标题部分中的#define PBV。

如果这不是正确的方法,任何指向正确方向的指针都将受到高度赞赏。

另外,如果这种方式不错,我不必在我的代码正文中指定以下内容:

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

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

//重复两次东西?有什么办法可以以某种方式避免这种情况吗?

感谢。

3 个答案:

答案 0 :(得分:4)

您的解决方案似乎没问题,但是它不允许您在一次运行中测试PBV与PBR(因为从一个'模式'切换到另一个'模式'将需要重新编译)。另一种解决方案是使function_to_call的参数类型成为模板参数。结果基本相同,但您可以从代码中调用function_to_call<Class1>(PBV)和function_to_call<Class1 &>(PBR),让编译器实例化两个版本。

答案 1 :(得分:1)

另一种可能性(需要重新编译)是使用typedef s

答案 2 :(得分: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之间切换。

感谢您的帮助。