1

私は組み込みのものを扱っているので、MCU 用の特別な C コンパイラ C30 を使用しています。一時的な構造での動作について混乱しています。

しかし、おそらく私は何かを知りません、そしてそれは意図された動作ですか?

少しのコードを考えてみましょう:

typedef struct {
   int a;
   int b;
} T_TestStruct1;

void test1(T_TestStruct1 *p_test_struct)
{
   /* do something */
}

そして、これらの呼び出しtest1()

void some_function()
{

   {
      T_TestStruct1 par = {
         .a = 1,
         .b = 1,
      };
      test1(&par);
   }

   {
      T_TestStruct1 par = {
         .a = 2,
         .b = 2,
      };
      test1(&par);
   }

}

ここではすべて問題ありません。スタックには のインスタンスが 1 つだけT_TestStruct1割り当てられています。しかし、私はより短い表現を使用するのが好きです:

void some_function()
{
   test1(&(T_TestStruct1){
      .a = 1,
      .b = 1,
      });

   test1(&(T_TestStruct1){
      .a = 2,
      .b = 2,
      });
}

次に、構造体{.a = 1, .b = 1}と構造体の両方{.a = 2, .b = 2}がスタックに割り当てられます。しかし、私の意見では、そうすべきではありません。実際に必要なインスタンスは 1 つだけです。

たまたま、私はそれを試しました:

void some_function()
{
   {
      test1(&(T_TestStruct1){
         .a = 1,
         .b = 1,
         });
   }

   {
      test1(&(T_TestStruct1){
         .a = 2,
         .b = 2,
         });
   }
}

結果は同じです。

それで、それは意図された動作ですか、それともコンパイラのバグですか?

4

2 に答える 2

2

すべての最適化の後、コンパイルされたコードに非揮発性変数がまったく存在するという保証は (C 標準では) ありません。同様に、コンパイルされたコードが最速かつ最小であり、最小量のリソース (スタックを含む) を使用するという保証はありません。

これが重要な場合は、コンパイラの最適化オプションを試すか、このコードをアセンブリで (インラインまたは非インラインで) 記述できます。

于 2013-02-11T06:53:29.977 に答える
1

実際、私はあなたに問題を引き起こす表現の利点を見ていません。コードが読みにくくなります。

ただし、それとは別に、コンパイラが構造体の 2 つのインスタンスを含むスタックフレームを作成するかどうかを予測することはできません。これは、コンパイラとその最適化エンジン次第です。ここでメモリの割り当てを本当に制御する必要があり、本当に最適化する必要がある場合は、この変数を一度割り当てて、両方の呼び出しで明示的に再利用することをお勧めします。なぜこのようにするのかコメントを残してください。

于 2013-02-11T06:58:49.873 に答える