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

まず、コンパイラがインライン化しない理由が見当たらないので、この演習で何も達成できない可能性が十分にあることを覚えておいてください。

副作用を回避するための最初の規則は、パラメーターが定義内で 1 回だけ出現するようにすることです。次に、定義で、パラメーターと定義全体を括弧で囲みます。

#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 に答える