【问题标题】:Do static local variables in C functions affect execution speed?C 函数中的静态局部变量会影响执行速度吗?
【发布时间】:2017-06-19 05:02:19
【问题描述】:

我知道最好不要在 C 中使用寄存器变量,除非您有特殊理由认为自己做出的决定比现代编译器做出的决定更好。

由于局部静态变量在函数调用之间存在,所以在执行速度很重要时使用这些变量是否有意义?

我正在开发一个 6502 模拟器(只是为了好玩和学习)。大多数模拟操作根本不需要局部变量,但有少数需要。我在下面粘贴了一个示例。基本上,我想知道将这些变量声明为静态是否有任何好处。不是为了在函数调用之间保留它们的值,而是为了防止它们的存储空间每次都被重新分配。这是另一种最好将其留给编译器的情况吗?

static void
op_asl_zero_page_x (CPU *cpu)
{
    unsigned int result;
    Word addr;
    Byte b;

    addr = zero_page_addr_XX (cpu, cpu->x);
    b = bus_read (cpu->bus, addr);

    /* Copy highest bit to carry */
    cpu->status[CPU_STATUS_C] = ((b & 0x80) != 0);

    result = (unsigned int)b << 1;
    bus_store (cpu->bus, addr, result);
    cpu_set_N_Z (cpu, result);
}

提前致谢:)

【问题讨论】:

  • 但是static 和非静态变量有不同的语义?他们的一生是不同的。不完全可以互换。
  • 这是另一个过早优化的案例。您只有在识别(毫无疑问)性能问题后才进行优化。也就是说,我认为堆栈指针更改多少字节对 CPU 来说并不重要,所以,不,局部变量(在典型的基于堆栈的实现中)并不慢。
  • 将变量设为静态会使代码更难阅读、更难调试,并且会产生非常有趣的错误源。我非常怀疑潜在的速度改进(如果有的话!)能否抵消这些不利因素。
  • 在没有考虑特定系统的情况下讨论优化是毫无意义的。

标签: c optimization static


【解决方案1】:

在典型的x86 系统上,当您输入一个函数时,为局部变量保留空间不会产生额外的计算成本。

进入一个函数意味着移动堆栈指针。移动 8 个字节并不比移动 16 个字节便宜。这是相同的汇编指令序列。

在堆栈中使用了更多内存,但除非您打算进行一些非常深的递归,否则您不必担心。所有这一切都假设您的编译器实际上决定使用堆栈来存储这些变量的内容(它们可能被映射到寄存器)。

因此,就计算而言,没有成本。在内存方面,成本非常低。

【讨论】:

  • 谢谢 slezica 和其他人。我对编译器究竟是如何做事非常模糊,但这是一种可以帮助我学习的项目。你的回答澄清了事情:)
  • 补充:static 存储持续时间意味着变量在程序的完整执行时间内存在,因此如果编译器无法优化它,则需要在内存中存储/访问变量使用远离。没有static,可以使用寄存器。
【解决方案2】:

我认为将函数声明为静态只是告诉编译器该函数只能在当前文件(xxx.o)中使用并且没有其他好处。

【讨论】:

  • 不正确,static 存储类指定了链接存储持续时间,参见my answer here。另外 OP 是在谈论变量,而不是函数本身。
猜你喜欢
  • 1970-01-01
  • 2019-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-29
  • 2020-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多