組み込みシステムの設計に携わっていると、誰かが巨大な if/else-Jungle で構成され、時には複数の画面の長さにまたがる ISR を作成したレガシー コードに直面することがよくあります。今、良いプログラマーになろうとして、私が学んだパラダイムを使って関数をリファクタリングしようとしています。
そこで、関数を複数の静的サブ関数に分解します。これらのサブ関数には、わかりやすい名前が付けられ、変数がカプセル化されます。しかし、私は組み込みデバイスで作業しているので、スタックサイズとジャンプ数を考慮する必要があります (特に、頻繁に呼び出され、それ自体が他の何かによって中断される可能性のある ISR では)。
現在、ほとんどの (またはすべての) コンパイラは、関数を強制的にインライン化することができます (__always_inline が 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;
}
インライン関数を使用:
#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;
}
}
}