gpt4 book ai didi

c++ - 堆栈(局部)或全局变量?

转载 作者:太空狗 更新时间:2023-10-29 23:41:41 27 4
gpt4 key购买 nike

使用全局变量会加快速度吗?在英特尔的体系结构软件开发人员手册(关于微处理器)中建议使用局部变量而不是全局变量。但是,请考虑以下代码:

void process_tcp_packets(void) {
char tcp_data[128];

do some stuff with the tcp_data[]....
}

void process_udp_packets(void) {
char udp_data[128];

do some stuff with the udp_data[]
}
void main_event_loop(void) {

while(1) {
if (pending_tcp_requests) {
process_tcp_packets();
}
if (pending_udp_requests) {
process_udp_packets();
}
}
}

执行main_event_loop()时,流程的控制取决于变量“pending_tcp_requests”和“pending_udp_requests”。函数 process_tcp_packets() 和 process_udp_packets() 被调用时,将在当前堆栈指针处分配局部变量。这意味着如果代码不断切换两个函数,局部变量将分配在相同的内存地址。在两个函数之间共享内存地址将从当前的 L1 缓存中逐出数据并减慢执行速度。因此,通过使用全局变量而不是局部变量,我们可以加快执行速度。对不对?

如果是这样,在这种情况下使用全局变量有什么缺点吗?

最佳答案

在这种情况下,全局变量不太可能让您受益于堆栈。

  1. 在堆栈上“分配”内存只是将一个数字添加到堆栈指针,一个 ½ 周期操作。
  2. L1 缓存大小为 64kb,足以容纳许多堆栈帧。此外,最近的几个堆栈帧(因为你在调用函数时压入参数)几乎总是在缓存中。事实上,要分配的下一个帧的区域通常在 L1 中,因为您通常只是退出了使用它的其他一些函数。
  3. 相比之下,全局变量很快就会脱离 L1。请记住,堆栈在每个函数的开头和结尾都会被触及(只是为了压入返回地址),process_tcp_packets() 和 process_udp_packets() 将使用大致相同的地址空间来存储它们的本地地址。
  4. 在函数之间共享内存地址不会从缓存中逐出数据。相反,它使您更有可能命中缓存。 The more recently you have touched an address, the more likely it is to be in cache .

关于c++ - 堆栈(局部)或全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8858412/

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