ANSI C#define VS函数

Mar*_* R. 4 c performance inline c-preprocessor ansi-c

我对我的代码的性能有疑问.假设我在C中有一个结构点:

typedef struct _CPoint
{
    float x, y;
} CPoint;
Run Code Online (Sandbox Code Playgroud)

以及我使用struct的函数.

float distance(CPoint p1, CPoint p2)
{
    return sqrt(pow((p2.x-p1.x),2)+pow((p2.y-p1.y),2));
}
Run Code Online (Sandbox Code Playgroud)

我想知道为#define替换这个函数是否是一个明智的想法,

#define distance(p1, p2)(sqrt(pow((p2.x-p1.x),2)+pow((p2.y-p1.y),2)));
Run Code Online (Sandbox Code Playgroud)

我认为它会更快,因为没有函数开销,我想知道我是否应该将这种方法用于我的程序中的所有其他函数来提高性能.所以我的问题是:

我应该用#define替换所有函数以提高代码的性能吗?

Jar*_*Par 8

不可以.您永远不应该根据感知到的性能差异在宏和函数之间做出决定.你应该根据宏上函数的优点来评估它.一般来说选择功能.

宏有许多隐藏的缺点,可以咬你.例如,您在此处对宏的转换是不正确的(或者至少不是保留原始函数的语义).宏的参数distance每次被评估2次.想象一下,我做了以下电话

distance(GetPointA(), GetPointB());
Run Code Online (Sandbox Code Playgroud)

在宏版本中,这实际上导致4个函数调用,因为每个参数被评估两次.已distance被留作为函数它只会导致3次函数调用(距离和每个参数).注:我忽略的影响sqrt,并pow在上面的计算,他们在这两个版本是相同的.