int get1(void) { return test; }
void get2(int* arg) { *arg = test;}
static int test = 5;
int main()
{
int result = 0;
result = get1();
get2(&result);
}
Run Code Online (Sandbox Code Playgroud)
get1()vs get2() - 哪一个对嵌入式系统表现更好?
get1()在通用架构上通常更快.(ARM,MIPS,x86等)
理由:
get2()在堆栈上使用额外的4字节内存来传递指针本身.这引入了2个额外的存储器访问,即一个PUSH arg呼叫之前,堆栈get2()和一个POP arg解引用它之前在函数内从栈.
请注意,根据调用约定,arg可以使用CPU寄存器传递实际参数.但即使这样,寄存器也需要在调用get1()函数内调用之前进行备份,然后恢复(即推送/弹出到堆栈).
get2()取消引用指针并对该内存位置执行写操作.在具有直写高速缓存的系统上,由于存储器访问,它将添加额外的延迟.get1()通过使用其中一个CPU寄存器来保存返回值,可以避免这种延迟,这在大多数体系结构中都很常见.
一般的经验法则是减少要传递的参数数量.
通常这被解释为意味着使用指向包含一堆单个参数的数组/结构的指针更好; 即1个参数(指针)优于N个参数(单个值).
但是,在上面的例子中,将返回值传递给val(即使用return和NOT by ref)允许在不使用任何参数的情况下实现该函数; 即0参数优于1参数.