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() - 哪个对嵌入式系统性能更好?
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() - 哪个对嵌入式系统性能更好?
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 参数。
您在嵌入式系统上的事实意味着我们不知道您使用的是什么架构,因此我们只能猜测性能。
但是,通过传递标量值(即不是结构或数组)return
通常比使用指针更快。使用指针需要将值写入内存,而我熟悉的所有架构都将使用专用寄存器来返回int
. 这意味着get1
只需将值从加载test
到寄存器中,而get2
可能必须执行内存到内存的移动,甚至是加载后存储(取决于架构)。