通过Return vs传递指针获取数据

时间:2013-09-18 05:58:58

标签: c performance embedded

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()vs get2() - 哪一个对嵌入式系统表现更好?

2 个答案:

答案 0 :(得分:5)

  

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

原因

  • get2()在堆栈上使用额外的4字节内存来传递指针本身。这引入了2个额外的内存访问,即在解除引用之前在函数内调用PUSH argget2()之前堆栈POP arg
    <子> 请注意,根据calling-conventions,可以使用CPU寄存器传递实际参数arg。但即使这样,寄存器也需要在调用函数内调用get1()之前进行备份,然后在之后恢复(即推送/弹出到堆栈)。

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


  

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

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

然而,在上述情况下,将返回值传递给val(即使用return和NOT by ref)允许在不使用任何参数的情况下实现该函数;即0参数优于1参数。

答案 1 :(得分:2)

您使用嵌入式系统这一事实意味着我们不知道您使用的是哪种架构,因此我们只能猜测性能。

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