c - C函数中的静态局部变量会影响执行速度吗?

标签 c optimization static

我知道最好不要在 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);
}

提前致谢:)

最佳答案

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

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

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

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

关于c - C函数中的静态局部变量会影响执行速度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44622572/

相关文章:

c - read() 和 fread() 有什么区别?

c - strtol 的正确行为是什么?

c - 如何使用 va_start()?

java - 大内存如何优化内存使用?

mysql - 如何使我的选择查询在 mysql 中更快?

C++ 删除静态数据

java - 如何在静态上下文中引用非静态方法(在实例上调用它们以进行方法序列化)

c - 为什么这些构造使用增量前和增量后未定义的行为?

json - JSON序列化/解析的时间复杂度

类属性中的 PHP 函数调用