使用大量C代码块会导致性能下降吗?

cha*_*rit 1 c macros block

我想根据以下内容定义一个宏:

#define MYCheckedCall(stmnt) do {         \
    status_t status = (stmnt);            \
    if (MYFail(status)) {                 \
        MYLog("Statement failed!");       \
    }                                     \
} while (0)
Run Code Online (Sandbox Code Playgroud)

每隔几次调用就可以在整个应用程序中使用它 这与每个地方重复代码的性能特征有什么关系?(即只定义status_t一次,没有额外的{}范围)

几点需要注意:

  • 这为堆栈添加了一个框架(用于存储status_t变量),因此我对perf的好奇心.
  • status_t是typedef int status_t或类似的东西.
  • 这将用于整个lib的一半代码.

我知道这有点过早的优化,但只是想知道它,因为它似乎应该是一个微不足道的决定?


代码现在看起来像什么的例子(没有宏):

status_t status = 0;
status = call1();
if (MYFail(status)) MYLog("call1 failed!");

status = call2();
if (MYFail(status)) MYLog("call2 failed!");
Run Code Online (Sandbox Code Playgroud)

我希望它与宏的例子:

MYCheckedCall( call1() );
MYCheckedCall( call2() );
Run Code Online (Sandbox Code Playgroud)

如果我只是C菜鸟并且有更好的模式/方式来实现这种功能,我也很想知道它.

我在Mac OS X 10.7上使用clang/llvm-gcc.

eca*_*mur 6

假设status_t是一个整数类型,我希望status每次存储在寄存器中或者最坏的同一个堆栈槽中的开销为零; 编译器不会打扰调整堆栈,因为它只能保留函数入口所需的最大堆栈空间并重用相同的堆栈槽.

一如既往,如果您感兴趣,应检查汇编程序输出以确认这是编译器的作用.


rli*_*den 6

过早优化不应该是一个担心.此外,代码大小通常也不是性能的可靠指标(认为重复一百万次的三行循环比一千条指令的程序花费大约一千倍的时间).所以,请考虑稍后进行优化.

在您的情况下,我不相信存在差异,因为预处理器使用您为宏创建的代码替换所有宏调用.所以,基本上你在谈论相同的代码(检查这个定义).