编译器Baremetal(arm-none-eabi)-编译器实现

时间:2019-03-22 13:00:19

标签: c++ c arm embedded cross-compiling

通常的做法是在函数的入口点声明堆栈变量(在执行堆栈上分配的变量,而不是动态或静态分配的变量),而不是与函数内部的指令混合。 参见示例1.a和1.b。 这样有助于提高可读性,甚至需要使用较旧的语言。

使用现代C / C ++不再需要(..但仍然是很好的做法)。

不过我的问题: 如果堆栈变量位于函数内部而不是入口点,则编译器如何解决该问题。 参见示例2.a和2.b,我可以想象他如何解决它。 什么是实际发生的事情?

  

1.a)示例(通用做法/最佳做法)

void main()
{
    int a = 3;      // best practice
    bool c = false; // best practice

    a += 16;

    if(a == 5)
    {
        c=false;
    }
}

...而不是...

  

1.b)示例(罕见)

void main()
{
    int a = 3;
    a += 16;

    bool c = false; // variable after some instructions executed..
    if(a == 5)
    {
        c=false;
    }
}
  

2.a)可能的编译器解决方案(A)

void main()
{
    int a = 3;
    a += 16;

    bool c = false; // COMPILER CUTS THIS LINE AND MOVES IT UP UNDER "int a = 3;"
    if(a == 5)
    {
        c=false;
    }
}
  

2.B)可能的编译器解决方案(B)

void main()
{
    int a = 3;
    a += 16;

    { // COMPILER ADDS SUBSECTION IN ORDER TO INTRODUCE NEW VARIABLES ON STACK
        bool c = false; 
        if(a == 5)
        {
            c=false;
        }
    }
}

1 个答案:

答案 0 :(得分:2)

编译器何时,如何以及在何处实例化或分配此类变量完全取决于实现。它可以在函数开始时为所有变量创建一个堆栈框架,或者可以在声明时扩展堆栈框架,或者可以完全不使用堆栈,而使用寄存器存储。

该语言仅要求实现正确的语义;在声明变量之前,该变量不在作用域内(即不能被代码引用),并且作用域在声明该变量的块的结束}之后结束。 / p>