2017-06-19 142 views
3

我明白,最好不要在C中使用寄存器变量,除非你有特别的理由认为你正在做出比现代编译器更好的决定。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); 
} 

感谢提前:)

+1

但'静态'和非静态变量有不同的语义?他们的一生是不同的。不完全可以互换。 –

+5

这是*过早优化*的另一种情况。您只在*确定*(无疑)性能问题后才进行优化。也就是说,我认为CPU的堆栈指针改变了多少字节并不重要,因此,不,局部变量(在典型的基于堆栈的实现中)不会变慢。 –

+0

使变量静态会使代码更难阅读,更难以调试,并会创建一个非常有趣的错误来源。我非常怀疑潜在的速度改进(如果有的话)可以弥补这些缺点。 – zoul

回答

7

在一个典型的x86系统,当你输入一个函数,则在为局部变量保留空间没有额外的计算成本。

输入函数意味着移动堆栈指针。移动它8个字节并不比移动它16个字节便宜。这与装配说明的顺序相同。

用起来比较内存,在栈中,但除非你打算做一些严重的深递归,你不应该担心。所有这些假设您的编译器实际上决定使用堆栈来存储这些变量的内容(它们可能会映射到寄存器)。

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

+0

谢谢,slezica和其他人。我对编译器的工作方式非常模糊,但这是一种能够帮助我学习的项目。你的回答澄清了一些东西:) –

+2

除此之外:'static'存储时间意味着变量在程序的完整执行时间内持续存在,所以如果编译器无法优化其使用情况,则需要在内存中存储/访问变量远。如果没有'static',可以使用寄存器。 –

0

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

+1

不正确,'static'存储类指定了连接*和*存储时间,请参阅[我的答案](https://stackoverflow.com/a/44614284/2371524)。 Plus OP是在谈论变量,而不是函数本身。 –

相关问题