DSP

[DSP+ARM] 函数优化(整理)

2019-07-13 12:27发布

原帖: http://bbs.21ic.com/icview-382765-1-1.html ===============================================================================================================================
Inline函数 

在 C++ 中,关键字 Inline 可以被加入到任何函数的声明中。 这个关键字请求编译器用函数内部的代码替换所有对于指出的函数的调用。(注: C99 标准也支持了 inline 关键字, 用于支持内联函数. 更多参考: 点击打开链接 好吧. 英文的 ^_^)

=============================================================================================================================== 这样做在两个方面快于函数调用:第一,省去了调用指令需要的执行时间;第二,省去了传递变元和传递过程需要的时间。(注: 类似于宏函数, 但是他们是有区别的. 啥区别呢? 参考这四个链接: 第一个  第二个  第三个  第四个)
=============================================================================================================================== 但是使用这种方法在优化程序速度的同时,程序长度变大了,因此需要更多的 ROM 。
使用这种优化在 Inline 函数频繁调用并且只包含几行代码的时候是最有效的。
=============================================================================================================================== 不定义不使用的返回值.
=============================================================================================================================== 对,函数定义并不知道函数返回值是否被使用,假如返回值从来不会被用到,应该使用 void 来明确声明函数不返回任何值。
=============================================================================================================================== 减少函数调用参数. (对于像 ARM 这样的 CPU, 他有自己的过程调用标准  AAPCS) =============================================================================================================================== 嗯,使用 全局变量 比函数传递参数更加有效率。这样做去除了函数调用参数入栈和函数完成后参数出栈所需要的时间。
=============================================================================================================================== 然而决定使用全局变量会影响程序的模块化和重入,故要慎重使用。(可以使用全局的结构体来把全局变量聚集起来, 防止满天飞.)
=============================================================================================================================== 所有函数都应该有原型定义. (??? 原型定义??? 不懂. 求高手解释, 没定义, 编译能通过? C++ 的?)
=============================================================================================================================== 一般来说,所有函数都应该有原型定义。原型定义可以传达给编译器更多的可能用于优化的信息。
=============================================================================================================================== 尽可能使用常量(const).
=============================================================================================================================== 嗯,C++ 标准规定,如果一个 const 声明的对象的地址不被获取,允许编译器不对它分配储存空间。
=============================================================================================================================== 把本地函数声明为静态的(static). (注: 从反汇编的结果就知, 另外有利于程序的模块化) =============================================================================================================================== 如果一个函数只在实现它的文件中被使用,把它声明为静态的 (static)以强制使用内部连接。否则,默认的情况下会把函数定义为外部连接。
=============================================================================================================================== 是啊,这样可能会影响某些编译器的优化——比如,自动内联.
=============================================================================================================================== 当然了, 我还是认为对于函数内部的处理, 算法层面的优化是第一位的. =============================================================================================================================== ===============================================================================================================================