C堆栈使用临时结构

我使用嵌入式东西,因此,我使用特殊的C编译器C30用于MCU。 我对它与临时结构的行为感到困惑。

但是,也许我不知道什么,它的意图是什么?

考虑一下代码:

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

结果是一样的。

那么,它是预期的行为,还是编译器中的错误?

实际上我没有看到表达的好处导致你的麻烦。 它使代码的可读性降低。

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

在所有优化之后,无法保证(在C标准中)您的非易失性变量将在编译代码中完全存在。 同样,不能保证编译的代码是最快和最小的,并且使用最少量的资源(包括堆栈)。

如果这对您来说很重要,您可以使用编译器的优化选项,也可以在汇编中编写此代码(内联或不内联)。