大規模なプロジェクト内で、同じメモリ構造で動作する C 関数のリストを作成します。これらの関数はコードの非常に異なる部分 (および個別にコンパイルされてからリンクされる異なるライブラリ) で呼び出されるため、各関数呼び出しの引数としてメモリ構造へのポインターを渡す必要がないようにしたいと考えています。
メモリ構造を静的変数として単一の関数に格納し、他の関数内で常にその関数を呼び出して、メモリ構造へのポインタを取得することを考えていました。以下のサンプルでは、ポインターstorage()
を設定するために使用しています。sto
以下のコードをテストしましたが、問題なく動作するようです。これは標準的なアプローチですか?私が実行しているリスクは何ですか? それは常に機能しますか?より良い解決策はありますか?
関数への同時呼び出しはありません。もちろん、割り当てられたメモリも解放する必要があります。
#include <stdio.h>
#include <stdlib.h>
int* storage(int get_set)
{
static int* sto;
if (get_set==1)
{
sto=malloc(2*sizeof(int));
sto[0]=1;
sto[1]=2;
}
printf("storage: content = %d %d, pointer= %d\n", sto[0], sto[1], sto);
return sto;
}
void add11()
{
int* sto =storage(0);
sto[0]+=1;
sto[1]+=1;
printf("add11: content = %d %d, pointer= %d \n", sto[0], sto[1], sto);
}
void multo0()
{
int* sto =storage(0);
sto[0]=sto[1]*sto[0];
sto[1]=0;
printf("multo0: content = %d %d, pointer= %d\n", sto[0], sto[1], sto);
}
int main(void) {
storage(1); // initialize memory only once
add11(); // work on memory
multo0();
add11();
// ...
return 0;
}
このようなものが欲しかった理由は次のとおりです。
私が書いている一連の関数は、画像強調の別の補助的なオプションのタスクを実行し、以前に観察された画像からさまざまな方法で学習します。 sto
この学習とパラメーター化オプションのメモリを保存します。
プロジェクト全体で、私の関数は複数のネストされた関数呼び出しで呼び出されます。引数として渡すsto
ということは、プロジェクトのメインで a ポインターを宣言し、関数によって実行されるタスクとは関係のない多数のネストされたコア関数を変更して、追加の引数を渡すことを意味します。
また、同じ関数セットを複数のわずかに異なるプロジェクトに統合する必要があるため、外部コードの変更を最小限に抑える必要がある、あまり邪魔にならない統合がプラスになります。
読みやすさの問題については、共有メモリにアクセスするすべての関数のみが同じプレフィックスを持っています。これが完全な解決策ではないことはわかっていますが、読みやすさが少し向上すると思います。
すべての機能をsto
プロジェクト全体に適用するように変更する以外に選択肢はありませんか?