gpt4 book ai didi

c++ - 运行时一次高效的函数选择器

转载 作者:行者123 更新时间:2023-12-02 09:47:52 24 4
gpt4 key购买 nike

我有一个需要并行执行多次的操作。例如,在点云处插入图像。对于这个操作我有几个变体。例如不同的插值函数(例如线性、二次、三次等)。问题是,如何在运行时高效地选择一次操作。我想避免每次调用操作时都出现分支。

通常,我会为此使用模板实例化。但是,我通过 Matlab Mex API 调用该函数。这意味着,我不知道编译时的“选择”操作。

现在,我正在考虑使用函数指针,但我没有使用它们的经验。什么是选择特定操作的一种变体的有效方法,以便后续调用将直接转移到正确的版本。

最小示例:

class Image
{
public:
size_t siz[3] = { 0, 0, 0 }; // image size (always 3D)
double *f; // input image

Image(double *f, size_t i, size_t j, size_t k) : f(f), siz{i, j, k} {
}

double interp_v1(size_t offset) {
return // insert code to do interpolation method 1
}

double interp_v2(size_t offset) {
return // insert code to do interpolation method 2
}

double interp_v3(size_t offset) {
return // insert code to do interpolation method 3
}

double (*interp)(size_t offset) {
return interp_v1 // use interp_v1 when interp is called (can be changed at runtime)
}

}

最佳答案

也许这两个选项应该大致相同。如果性能确实很重要,那么只需测量您的代码即可。我做了一个基准测试,发现 ifs 和指针一样快。

请记住,如果您使用函数指针,则有一个间接寻址,并且使用“if”语句分支不应该是一个大问题,因为分支预测每次(理论上)都会在经过一段时间后开始猜测正确。来电。因此,您可能应该选择感觉更清晰、更容易理解的一种。就我而言,if 语句使这一点更加清晰,并且可能使内联更加可行。

我尝试过的另一个选项似乎同样快(在某些情况下甚至更快)是动态多态性。如果有人想要添加新方法,这也更容易维护。这是一个动态多态性的例子。:

struct Base {
void whatever() = 0;
};

struct Method1: Base {
void whatever() override {
//Code for first method
}
};

struct Method2: Base {
void whatever() override {
//COde for second method..
}
};

这里有我的基准的链接:https://quick-bench.com/q/1mR0EyYrqvzunpEGbrHBw_U7eEY

关于c++ - 运行时一次高效的函数选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63672176/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com