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

问题描述 投票:-2回答:1

通常的做法是在函数的入口点声明堆栈变量(在执行堆栈上分配的变量而不是动态或静态),而不是与函数内的指令混合。参见实施例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;
        }
    }
}
c++ c arm embedded cross-compiling
1个回答
2
投票

编译器实例化或分配此类变量的时间,方式和位置完全取决于实现。它可以在函数开始时为所有变量创建一个堆栈帧,或者它可以在声明点扩展堆栈帧,或者它可能根本不使用堆栈而是使用寄存器存储。

该语言只要求实现正确的语义;在声明变量之前,变量不在范围内(即不能被代码引用),并且范围在声明它的块的结束}之后结束。

© www.soinside.com 2019 - 2024. All rights reserved.