编辑:请注意,当我提到性能比较时,不是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
}
//重复两次东西?有什么办法可以以某种方式避免这种情况吗?
感谢。
答案 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之间切换。
感谢您的帮助。