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

标签 c++ c

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

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/

相关文章:

C++ 头文件返回对类型

c++ - 如何一次从文件中读取两个十六进制值

c - 结构中的函数指针

c - localtime 的结果结构如何在 C 中分配?

c - 使用链表进行两个多项式相乘的程序

c++ - 在 C++ 中删除多维结构会导致访问冲突

c++ - C++中变量前的双破折号

c++ - 将斯坦福 C++ 库添加到 Visual Studio 2015

c - 跳过位图到字符串转换器中的填充?

将整数转换为二进制并将值存储到数组中