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);
   }

}

这里一切正常: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}被分配到堆栈中。但是,在我看来,他们不应该是。实际上只需要一个实例。

只是偶然,我尝试过:

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

实际上,我没有看到这种表达方式给您带来麻烦的好处。它使代码的可读性降低。

但除此之外:您无法预测编译器是否创建了包含两个结构实例的堆栈帧。这取决于编译器和他的优化引擎。如果你真的需要控制这里的内存分配并且你真的需要优化,我建议分配一次这个变量并明确地为两个调用重用它,留下评论为什么你这样做。

于 2013-02-11T06:58:49.873 回答