C++ 将函数逻辑分解为子函数

C++ 将函数逻辑分解为子函数,c++,c,C++,C,将函数拆分成更小的子函数并放入代码中,会影响程序的效率吗? 在降低函数的圈复杂度的同时,我将函数分解为更小的部分,并使用了辅助函数和内联函数 void functionParent(arguments) { intialCheckFunction(arguments); functionOne(); functionTwo(); functionThree(); functionFour(); return STATUS; } void fu

将函数拆分成更小的子函数并放入代码中,会影响程序的效率吗? 在降低函数的圈复杂度的同时,我将函数分解为更小的部分,并使用了辅助函数和内联函数

void functionParent(arguments)
{

    intialCheckFunction(arguments);
    functionOne();
    functionTwo();
    functionThree();
    functionFour();

    return STATUS;
}

void functionOne()
{
   /*follows unary Principle.*/
}
我关心的是堆栈指针,频繁切换SP是否会大幅降低程序的效率,或者可以忽略不计。 上面的函数一,二,。。他们有一元逻辑。
Kind
在这里输入代码
在两种上下文中,C以及C++

通常我更喜欢将函数分解成更小的函数,以便我们可以在其他地方重用它,在重新分解过程中经常需要它。如果您非常关心开关,并且函数非常小,那么可以将其标记为内联。但是,我不认为函数太多会对程序的性能产生如此大的影响。

只要您认为逻辑有助于可读性,就应该将其拆分为自己的函数:函数调用本身的成本可以忽略不计

尽管调用函数通常会消耗一些空间和CPU周期,但您根本不应该担心它:所涉及的指令经过了难以置信的优化,编译器可以在认为合适的时候内联您的代码

编辑(响应)


您需要小心的是传递参数,特别是在C++中,用户代码可以参与复制传递给函数的参数的过程。通过值传递大的<代码>结构> /CODEXS,C中的循环数也会超过几个周期,所以您可以随时引用或指针传递它们。

< P>如果您使用C++,可以声明内联函数。 一旦代码被替换,函数调用就不会产生开销

inline bool check(args){
    if( some_condiction(args) ){
        return true;
    }
}
inline void functionOne(){...}
inline void functionTwo(){...}
inline void functionThree(){...}
inline void functionFour(){...}

int functionParent(arguments){

    if(check(arguments)==false)
         return FAIL;

    functionOne();
    functionTwo();
    functionThree();
    functionFour();

    return STATUS;
}
当前的处理器架构每次执行一条以上的指令,比如说5条。在某一特定时刻,他们可能处于完成的中间阶段,比如说90%、80%、70%、60%、50%。如果第一条指令是一个函数调用,那么所有评估下4条指令的努力都将白费,这将大大降低程序的执行速度


不需要太在意这些细节,除非您正在创建一个关键的应用程序。通常,在使用优化标志时,编译器足够聪明,可以内联所需的函数。

在大多数情况下,编译器会在可能的情况下尝试内联函数(不确定是否应该为此启用某种级别的优化)。但是(如果我没有错的话)对于内联循环的函数不会改变任何东西(如果我错了,请纠正我)。@b内联编译器倾向于非常积极地内联,因为一级代码缓存通常不是稀缺资源。循环不一定会影响任何东西。关键指标是函数中的指令数。@potatosatter感谢您的澄清。我很久以前就听说过,不确定这是真的。你听说过圈复杂度,但不是过早优化?除非需要,否则不要担心性能。如果需要的话,在尝试分析之前,先准备好质量保证的指标。是的,我没有听说过过早的优化和指标,尽管在你的建议之后,我也在尝试更新它。我真正关心的是,我在250-500 MHZ上使用我的代码。这种违背一元原则的代码是否会影响效率。250-500 MHz几乎不能告诉我们您在做什么。然而,关键是,除非你有理由分析效率,否则你甚至不能开始这样做。优化不是从关注小细节开始的,这是一种浪费,而且往往会损坏代码库。谢谢,我要记住“优化不是从关注小细节开始的,这是一种浪费,而且往往会损坏代码库”。我试图学习如何使用干净的代码并重新考虑代码。我在做一个机顶盒:我在做一个250-500兆赫的进程的机顶盒,你能解释一下CPU周期切换程序堆栈吗。感谢您的宝贵意见…@Ashutosh 250..500 MHz仍然非常快:它比80年代初的原始PC快50..100倍:)函数调用需要每个传递的参数几个周期,以及几个周期来将返回地址推送到堆栈上,并将程序计数器设置为其新值。类似地,return指令需要一两个周期才能从堆栈中获取返回地址并将其恢复到程序计数器中。总的说来,这很快,因为它被大量使用。@ dasBrink NealEngin C++中的参数可能需要数千个循环,它是通过深度拷贝传递的,或者如果调用方只将其加载到它正在进行的位置,则为零。正如@Jeeva提到的,函数通常是内联的。真的,我们没什么特别能说的。