【发布时间】:2014-07-25 21:24:07
【问题描述】:
我有一个 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;
}
【问题讨论】:
-
您担心什么副作用?这段代码似乎没有修改任何内容。
-
表达式
((uintptr_t) p & FLAG1_BIT) != 0没有任何副作用。 -
可能我应该发布一个函数,用
return (struct node*) ((uintptr_t) p | FLAG1_BIT);设置标志 -
宏不可能比内联函数提供更好的代码。你真的使用指针的第三个低位作为标志吗?
-
失败了吗?你看过生成的代码吗?
标签: c macros c-preprocessor inline-functions