如何在不增加堆栈大小的情况下分解C函数

如何在不增加堆栈大小的情况下分解C函数,c,refactoring,inline,compiler-optimization,stack-size,C,Refactoring,Inline,Compiler Optimization,Stack Size,在从事嵌入式系统设计时,我经常遇到遗留代码,其中有人编写了一些ISR,其中包含一个巨大的if/else丛林,有时跨越多个屏幕长度。现在,为了成为一名优秀的程序员,我尝试使用我学到的范例重构函数,其中之一是:“函数应该只做一件事” 因此,我将函数分解为多个静态子函数,这些子函数具有描述性名称并封装了变量。但由于我在嵌入式设备上工作,我需要考虑堆栈大小和跳转次数(特别是在ISR中,它可能经常被调用,并且本身可能会被其他东西打断) 现在,当然可以强制大多数(甚至所有)编译器内联函数(就像gcc中的“总

在从事嵌入式系统设计时,我经常遇到遗留代码,其中有人编写了一些ISR,其中包含一个巨大的if/else丛林,有时跨越多个屏幕长度。现在,为了成为一名优秀的程序员,我尝试使用我学到的范例重构函数,其中之一是:“函数应该只做一件事”

因此,我将函数分解为多个静态子函数,这些子函数具有描述性名称并封装了变量。但由于我在嵌入式设备上工作,我需要考虑堆栈大小和跳转次数(特别是在ISR中,它可能经常被调用,并且本身可能会被其他东西打断)

现在,当然可以强制大多数(甚至所有)编译器内联函数(就像gcc中的“总是内联”一样)。但即使这样,如果我必须传递参数(它们不一定会得到优化),即使每个参数只有几个字节,也会增加堆栈大小

现在我要问的实际问题是:在分解C中的函数时,有没有办法不增加堆栈大小?

编辑: 为了让我的问题更清楚:下面是一些代码的示例,我只是将一些代码转换为内联函数

静态堆栈使用率为144(不含内联函数),160(含内联函数)

原件:

#include <stdio.h>
#include <string.h>

int main(){

  char inputString[100];
  scanf("%s",inputString);

  static char delimiterArray[] = {' ','+','-','/','*','='};
  for(int i = 0; i<sizeof(inputString); i++){
    printf("%c",inputString[i]);

    char* inputChar = inputString + i;
    for(int j = 0; j<sizeof(delimiterArray);j++){
      if( *inputChar == delimiterArray[j]){
        printf("DELIMITER: %c",delimiterArray[j]);
      }
      if(inputString[i] == '\0'){
        printf("\nNuberOfChars: %d\n",i);
        break;
      }
    }
  }

  return 0;
}
#包括
#包括
int main(){
字符输入字符串[100];
scanf(“%s”,输入字符串);
静态字符分隔符数组[]={','+','-','/','*','='};

对于(int i=0;iYou可以将其分解为函数,但可以通过减少“调用函数层次结构”(一个“谁调用谁”树)中的级别数来最小化堆栈)。使用
静态
子函数。编译器将内联静态函数,这些函数只调用一次。生成内联函数可以提高性能并减少堆栈的使用。为什么您认为内联函数会增加堆栈大小?当然,内联函数会比非内联函数减少堆栈大小。我的问题是about将代码分解成几个内联函数,这些函数事先不是函数。因此,这是关于内联函数与普通代码的比较。事实上,如果您编写一些代码行并将其中一些代码移动到内联函数中(凭我的直觉,这不会有任何区别,堆栈的用法略有不同。我在原始问题中加入了一个示例。
#include <stdio.h>
#include <string.h>

static inline void checkForDelimiters(char* inputChar)__attribute__((always_inline));
static inline void decomposeString(char* inputString)__attribute__((always_inline));

int main(){

  char inputString[100];
  scanf("%s",inputString);
  decomposeString(inputString);

  return 0;
}

static void checkForDelimiters(char* inputChar){
  static char delimiterArray[] = {' ','+','-','/','*','='};
  for(int j = 0; j<sizeof(delimiterArray);j++){
    if(*inputChar == delimiterArray[j]){
      printf("DELIMITER: %c",delimiterArray[j]);
    }
  }
}

static void decomposeString(char* inputString){

  for(int i = 0; i<sizeof(inputString); i++){
    printf("%c",inputString[i]);
    checkForDelimiters(inputString+i);

    if(inputString[i] == '\0'){
      printf("\nNuberOfChars: %d\n",i);
      break;
    }
  }
}