1
int get1(void) { return test; }
void get2(int* arg) { *arg = test;}

static int test = 5;

int main()
{
int result = 0;

result = get1();

get2(&result);

}

get1() 与 get2() - 哪个对嵌入式系统性能更好?

4

2 回答 2

5

get1()在常见架构上通常更快。(ARM、MIPS、x86 等)

原因

  • get2()在堆栈上使用额外的 4 字节内存来传递指针本身。这引入了 2 次额外的内存访问,即PUSH arg在调用之前到堆栈get2()POP arg在取消引用之前从函数内的堆栈访问。
    请注意,根据调用约定,实际参数arg可能会使用 CPU 寄存器传递。但即便如此,在调用函数中调用之前需要备份寄存器并在get1()之后恢复(即推入/弹出堆栈)。

  • get2()取消引用一个指针并对那个内存位置执行写操作。在具有直写缓存的系统上,由于内存访问,它会增加额外的延迟。get1()可以通过使用其中一个 CPU 寄存器来保存返回值来避免这种延迟,这在大多数体系结构中都很常见。


一般的经验法则是减少要传递的参数数量

通常这被解释为意味着使用指向包含一堆单独参数的数组/结构的指针更好;即 1 个参数(指针)优于 N 个参数(单个值)。

然而,在上述情况下,通过 val 传递返回值(即使用 return 而不是通过 ref)允许在完全不使用任何参数的情况下实现函数;即 0 参数优于 1 参数。

于 2013-09-18T06:19:37.443 回答
2

您在嵌入式系统上的事实意味着我们不知道您使用的是什么架构,因此我们只能猜测性能。

但是,通过传递标量值(即不是结构或数组)return通常比使用指针更快。使用指针需要将值写入内存,而我熟悉的所有架构都将使用专用寄存器来返回int. 这意味着get1只需将值从加载test到寄存器中,而get2可能必须执行内存到内存的移动,甚至是加载后存储(取决于架构)。

于 2013-09-18T06:03:34.760 回答