c - 优化 c 中函数的参数(GCCarm)

标签 c arm function-pointers

我的微 Controller 内存有限。(使用 arm gcc) 我应该尽可能高效地编写我的代码。考虑功能爆炸:

int foo(uint32_t a , float b)
{
    .....
    return 0;
}

所以我有两个参数 ab。现在,如果我将参数更改为 *a*b,则该函数在执行期间比第一个函数占用的内存更少:

int foo(uint32_t *a,float *b)
{
    ....
    return 0;
}

如果参数变成字符串或数组(int、float ....)怎么办? 任何引用都会很棒。谢谢

最佳答案

使用指针实际上会浪费内存。这有两个原因。

<强>1。寄存器优化丢失

调用foo 的代码必须将变量的地址作为参数传递。如果传递的变量是本地变量,它可能在寄存器中,但因为您获取了它的地址,所以它必须放在堆栈中。一般来说,在寄存器中使用变量比在堆栈中使用变量更快。

<强>2。调用后变量值未知

当你给出变量函数的地址时,编译器不再知道变量是否被修改,如果再次读取它必须刷新它。

 uint32_t u = 1;
 float f = 2.0f;
 foo(&u, &f); // 1. Address taken, u and f cannot be register variables
 // 2. What is value of u now? It must refreshed from memory before addition happens
 u++;

底线:除非万不得已,否则不要使用基本类型的地址。

字符串和数组已经使用地址传递,所以没有其他选择。

关于c - 优化 c 中函数的参数(GCCarm),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28316889/

相关文章:

c++ - MySQL C++ 连接器 : error adding symbols: File format not recognized

c++ - 从内存位置调用函数指针

c++ - 不允许成员函数的非指针类型定义?

c - 悬空指针"Visualization"

c - 将 X.509 证书存储在 C 字符串中并将其加载到 SSL_CTX 对象中?

c - 如何在c中多次出现 '/'时使用strchr获取子字符串并将其存储在变量中

c - 在 ARM 上取消引用指向不完整类型但不是 x86 上的指针

C预处理器: dynamic const char

c - 为什么 -1 >> 1 和 0xFFFFFFFF >> 1 会产生不同的结果?

c++ - 你如何将一个类的函数作为参数传递给同一个类的另一个函数