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() - 哪一个对嵌入式系统表现更好?
答案 0 :(得分:5)
get1()
通常在常见架构上更快。 (ARM,MIPS,x86等)
原因:
get2()
在堆栈上使用额外的4字节内存来传递指针本身。这引入了2个额外的内存访问,即在解除引用之前在函数内调用PUSH arg
和get2()
之前堆栈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
可能需要执行内存到内存的移动,甚至加载后跟存储的加载(取决于架构)。