0

我有一个 1 行inline函数,它是我的代码中热点的一部分。我想看看将其更改为宏是否有益。作为一个函数写作我不必担心副作用。但是我如何为此编写一个没有副作用的宏呢?

#define FLAG1_BIT 4
struct node
{
    unsigned long key;
    struct node* child[K];      //format <address,flag1,flag2,flag3>
};

static inline bool isFlag1Set(struct node* p)
{
    return ((uintptr_t) p & FLAG1_BIT) != 0;
}
4

2 回答 2

5

首先,请记住,我看不出编译器为什么不内联它的原因,所以这个练习很有可能一无所获。

避免副作用的第一条规则是确保参数在定义中只出现一次。接下来,在定义中,将参数和整个定义括在括号中:

#define isFlag1Set(p)   (((uintptr_t) (p) & FLAG1_BIT) != 0)
于 2014-07-25T21:32:07.267 回答
-4

尝试:

#define IS_FLAG_1_SET(p)                \
{                                       \
     (((uintptr_t) p & FLAG1_BIT) != 0) \
}
于 2014-07-25T21:29:33.620 回答