已编辑:请注意,当我提到性能比较时,它不是 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 取决于我在 header 部分中的#define PBV。
如果这不是正确的方法,我们将不胜感激任何指向正确方向的指示。
此外,如果这种方式不错,我是否不必在代码主体中指定以下内容:
function_to_call(Class1& class1object){//Actual function details for PBR
//Stuff
}
和
function_to_call(Class1 class1object){//Actual function details for PBV
//Stuff
}
//Stuff 被重复了两次?有什么办法可以避免这种情况吗?
谢谢。
最佳答案
您的解决方案看起来不错,但它不允许您在单次运行中测试 PBV 与 PBR(因为从一种“模式”切换到另一种“模式”需要重新编译)。另一种解决方案是使 function_to_call 的参数类型成为模板参数。结果基本上是一样的,但您可以调用 function_to_call<Class1>
(PBV) 和 function_to_call<Class1 &>
(PBR) 并让编译器实例化两个版本。
关于c++ - 参数类型不同的相同函数 - 按值/引用传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4123938/