我们应该使用宏,内联函数还是只是普通函数并信任编译器?

时间:2014-11-22 17:41:03

标签: c optimization macros inline-functions

将以下函数定义为宏或inline函数会更好吗?或者更好的是使用普通函数并信任编译器,以维持(在我看来)更好的可读性?

typedef unsigned char byte;

void set_size_mark(byte size_mark, byte *ptr)
{
    *ptr += size_mark << 1;
}

byte get_size_mark(byte *ptr)
{
    return *ptr >> 1;
}

3 个答案:

答案 0 :(得分:2)

你应该内联那些。无论如何,编译器几乎肯定会这样做。

代码是一行,不太可能创建代码膨胀,因此内联可能更有效。编译器知道这一点,但是,如果这不正确,我认为编译器可以忽略inline关键字。

一般来说,你应该避免使用宏 - 它们会导致许多意想不到的问题,并且通常与内联函数一样糟糕,而且使用起来要困难得多。有宏的用途,但这绝对不适合一个。

答案 1 :(得分:1)

您可能应将这些函数声明为static inline函数,并在标题文件中定义它们。

(或者,通过使用最近的link-time optimization编译并将gcc -flto -O2相关联来启用GCC

答案 2 :(得分:0)

首先,definitely不是宏。现在,我们必须在:

之间做出选择
  1. 永远不要写inline
  2. 有时写<{1}}
  3. 当前版本中的GCC将决定是否应该内联该函数。那么,为什么要这么麻烦?这就是为什么我会选择选项1.更短的代码和更少的代码的作者和读者花费的时间。