Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 选择循环内部函数以避免开销的最干净方法?_C_Function_For Loop - Fatal编程技术网

C 选择循环内部函数以避免开销的最干净方法?

C 选择循环内部函数以避免开销的最干净方法?,c,function,for-loop,C,Function,For Loop,我有一个计算图的最小生成树的函数,我有两种不同的方法来计算树中的边权重 edge\u weight()函数在几个循环中反复调用,使用哪个函数取决于树的类型,树的类型在主函数之外指定(由用户指定) 我的问题是,除了edge\u weight()函数之外,for循环中的所有内容都是相同的,因此我不想复制/粘贴代码 但同时我不想在for循环中设置要使用的edge\u weight()函数的条件,以避免重复的if条件的开销 那么,在不复制/粘贴相同代码的情况下,指定for循环开始之前使用哪个函数的最干净

我有一个计算图的最小生成树的函数,我有两种不同的方法来计算树中的边权重

edge\u weight()
函数在几个
循环中反复调用,使用哪个函数取决于树的类型,树的类型在主函数之外指定(由用户指定)

我的问题是,除了
edge\u weight()
函数之外,
for
循环中的所有内容都是相同的,因此我不想复制/粘贴代码

但同时我不想在for循环中设置要使用的
edge\u weight()
函数的条件,以避免重复的
if
条件的开销

那么,在不复制/粘贴相同代码的情况下,指定
for
循环开始之前使用哪个函数的最干净方法是什么呢

我可以有指向函数的指针吗(这会减慢代码的速度吗?)? 我可以把函数放在变量、数组中吗

编辑:速度对于此应用程序至关重要,因此我尝试避免在
for
循环中进行调节

下面是一些伪代码:

while(nodes < threshold)        
    {
        for (int i = 0; i < K; i++)
        {
            if (nodes[i] == something) 
            {
                weight = one_of_two_edge_weight_functions();    
while(节点<阈值)
{
for(int i=0;i
我看不出有什么办法可以让逻辑在某个地方决定调用哪个函数。@TimBiegeleisen,但是你能让逻辑在while循环之外吗?请给出实际问题的一个最小表示。我们可能能够在单独的批次中调用两个权重函数,但你的pseudo-code。除非边权重函数很小、很快且可内联,否则使用函数指针可能不会显著降低速度…如果这两个函数很小且很纯(没有副作用),则可以调用它们并使用三元选择指定结果(
?:
),一个好的编译器会将其转化为无分支代码。然而,除非条件预测得非常糟糕,或者循环可以通过这种方式矢量化,否则在现代CPU上不会有性能优势。我看不出有什么办法可以让逻辑在某个地方决定调用哪个函数。@TimBiegeleisen,但你能以某种方式拥有这种逻辑吗在while循环之外?请给出实际问题的最小表示形式。我们可能能够在单独的批处理中调用两个权重函数,但这在伪代码中并不清楚。除非边权重函数很小、很快且可内联,否则使用函数指针可能不会显著降低速度。。。如果这两个函数都很小且很纯(没有副作用),则可以调用这两个函数并使用三元选择分配结果(
?:
),一个好的编译器会将其转化为无分支代码。然而,除非条件预测得非常糟糕,或者循环可以通过这种方式矢量化,否则在现代CPU上不会有性能优势。