gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:08:50 26 4
gpt4 key购买 nike

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

对于现代 C/C++,它不再是必需的(..但仍然是很好的实践)。

我的问题是:如果堆栈变量位于函数内部而不是入口点,编译器如何解决这个问题。请参阅示例 2.a 和 2.b,我可以想象他是如何解决这个问题的。到底发生了什么?

1.a) Example (Common Practice / Best Practice)

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

a += 16;

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

...而不是...

1.b) Example (Uncommon)

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

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

2.a) Possible compiler solution (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) Possible compiler solution (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;
}
}
}

最佳答案

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

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

关于c++ - 编译器 Baremetal (arm-none-eabi) - 编译器实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55300188/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com