[软件资料] C语言全局变量的重点使用

[复制链接]
966|9
 楼主| szt1993 发表于 2024-3-9 14:00 | 显示全部楼层 |阅读模式

全局变量绝不会位于寄存器中。使用指针或者函数调用,可以直接修改全局变量的值。
因此,编译器不能将全局变量的值缓存在寄存器中,但这在使用全局变量时便需要额外的
(常常是不必要的)读取和存储。所以,在重要的循环中我们不建议使用全局变量。

如果函数过多的使用全局变量,比较好的做法是拷贝全局变量的值到局部变量,
这样它才可以存放在寄存器。这种方法仅仅适用于全局变量不会被我们调用的任意函数使用。
例子如下:

  1. int f(void);
  2. int g(void);
  3. int errs;
  4. void test1(void)
  5. {  
  6.     errs += f();  
  7.     errs += g();
  8. }
  9. void test2(void)
  10. {  
  11.     int localerrs = errs;  
  12.     localerrs += f();  
  13.     localerrs += g();  
  14.     errs = localerrs;
  15. }

注意,test1必须在每次增加操作时加载并存储全局变量errs的值,而test2存储localerrs于寄存器并且只需要一个计算机指令。

评论

不建议使用太多全局变量  发表于 2024-3-13 09:56
LOVEEVER 发表于 2024-3-9 15:52 | 显示全部楼层
test1必须在每次增加操作时加载并存储全局变量errs的值,而test2存储localerrs于寄存器并且只需要一个计算机指令
星辰大海不退缩 发表于 2024-3-11 11:52 | 显示全部楼层
全局变量绝不会位于寄存器中。使用指针或者函数调用,可以直接修改全局变量的值。
OKAKAKO 发表于 2024-3-11 15:30 | 显示全部楼层
LOVEEVER 发表于 2024-3-9 15:52
test1必须在每次增加操作时加载并存储全局变量errs的值,而test2存储localerrs于寄存器并且只需要一个计算 ...

一个指令的增加对于MCU内部执行有时会增加执行路径,使整体时间加长
小小蚂蚁举千斤 发表于 2024-3-18 16:59 | 显示全部楼层
test1必须在每次增加操作时加载并存储全局变量errs的值,而test2存储localerrs于寄存器并且只需要一个计算机指令。
小夏天的大西瓜 发表于 2024-3-18 18:40 | 显示全部楼层
全局变量绝不会位于寄存器中
中国龙芯CDX 发表于 2024-3-21 15:24 | 显示全部楼层
全局变量绝不会位于寄存器中,那应该如何将数据放在寄存器中呢?
jf101 发表于 2024-3-22 11:27 | 显示全部楼层
全局变量绝不会位于寄存器中。使用指针或者函数调用,可以直接修改全局变量的值。
 楼主| szt1993 发表于 2024-3-25 15:35 | 显示全部楼层
星辰大海不退缩 发表于 2024-3-11 11:52
全局变量绝不会位于寄存器中。使用指针或者函数调用,可以直接修改全局变量的值。
...

如果函数过多的使用全局变量,比较好的做法是拷贝全局变量的值到局部变量,这样它才可以存放在寄存器
您需要登录后才可以回帖 登录 | 注册

本版积分规则

350

主题

3021

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部