【问题标题】:Mark variable as "done for"将变量标记为“完成”
【发布时间】:2020-10-31 05:52:20
【问题描述】:

C 中是否有语法让编译器知道某个变量已完成并且今后将不再使用,从而可能释放寄存器?我宁愿不使用函数调用,因为它们很昂贵。

我知道我可以重用一个变量,但这会导致歧义(这个变量是什么意思?)。

例子:

first_byte = somestring[0];
/*[do a couple of operations on first_byte]*/
done_for(first_byte);
second_byte = somestring[1];

我没有将数组+索引直接提供给我的操作的原因是因为我不确定是否所有编译器都会优化它以使用临时寄存器而不是每次都转换地址。

不,我不能使用像“temp”这样的名称。这是关于读取打包数据结构的。

【问题讨论】:

  • 在函数块内定义变量。
  • @KamilCuk 所以它不会将“多余”变量放在(慢)堆栈上?
  • 编译器已经分析了变量的活跃度。你不需要做任何事情来帮助他们。
  • @FiddlingBits 大括号中的语句相当复杂。
  • 留给编译器。只需启用优化。编译器将决定是否必须将其存储在某个地方。或者开始用汇编程序编程。

标签: c variables cpu-registers


【解决方案1】:
{
 int first_byte = somestring[0];
/*[do a couple of operations on first_byte]*/
}
second_byte = somestring[1];

将其包装到复杂语句中。 first_byte 将仅存在于大括号内。

【讨论】:

  • 如这里所示:stackoverflow.com/questions/45387465/…,变量的范围和活力将被限制在大括号的代码块中。或者,您始终可以使用指针,分配一些内存,使用它,并最终使用 free() 将其丢弃。
  • @Confidenc3 我正在为 avr 微控制器写作,ram 相当稀有且昂贵:P,但在桌面环境中是一个很好的提示。
  • @AnnoyinC 启用优化。只有没有它,它才会始终存储在某个地方。否则编译器将决定。您对寄存器分配没有任何控制权(除了作为 avr-gcc 扩展的全局寄存器分配 - 但它使编译器工作更加困难并且几乎总是导致代码更差)
  • 我只想重申,编译器完全能够在没有程序员帮助的情况下分析活性。如果任何常用的编译器在有或没有内部作用域的情况下生成不同的代码,我都会感到非常惊讶。
  • @sepp2k 但它也设置了符号的范围,它可以在其他地方使用。编译器无济于事
猜你喜欢
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-07
  • 2019-04-07
相关资源
最近更新 更多