打印
[软件资料]

C语言全局变量的重点使用

[复制链接]
402|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
szt1993|  楼主 | 2024-3-9 14:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

int f(void);
int g(void);
int errs;
void test1(void)
{  
    errs += f();  
    errs += g();
}
void test2(void)
{  
    int localerrs = errs;  
    localerrs += f();  
    localerrs += g();  
    errs = localerrs;
}

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

使用特权

评论回复
评论
forgot 2024-3-13 09:56 回复TA
不建议使用太多全局变量 
沙发
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内部执行有时会增加执行路径,使整体时间加长

使用特权

评论回复
5
小小蚂蚁举千斤| | 2024-3-18 16:59 | 只看该作者
test1必须在每次增加操作时加载并存储全局变量errs的值,而test2存储localerrs于寄存器并且只需要一个计算机指令。

使用特权

评论回复
6
小夏天的大西瓜| | 2024-3-18 18:40 | 只看该作者
全局变量绝不会位于寄存器中

使用特权

评论回复
7
中国龙芯CDX| | 2024-3-21 15:24 | 只看该作者
全局变量绝不会位于寄存器中,那应该如何将数据放在寄存器中呢?

使用特权

评论回复
8
jf101| | 2024-3-22 11:27 | 只看该作者
全局变量绝不会位于寄存器中。使用指针或者函数调用,可以直接修改全局变量的值。

使用特权

评论回复
9
szt1993|  楼主 | 2024-3-25 15:35 | 只看该作者
星辰大海不退缩 发表于 2024-3-11 11:52
全局变量绝不会位于寄存器中。使用指针或者函数调用,可以直接修改全局变量的值。
...

如果函数过多的使用全局变量,比较好的做法是拷贝全局变量的值到局部变量,这样它才可以存放在寄存器

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

267

主题

2254

帖子

4

粉丝