【问题标题】:Convert an inline function to a macro将内联函数转换为宏
【发布时间】: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 &amp; FLAG1_BIT) != 0没有任何副作用。
  • 可能我应该发布一个函数,用return (struct node*) ((uintptr_t) p | FLAG1_BIT); 设置标志
  • 宏不可能比内联函数提供更好的代码。你真的使用指针的第三个低位作为标志吗?
  • 失败了吗?你看过生成的代码吗?

标签: c macros c-preprocessor inline-functions


【解决方案1】:

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

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

#define isFlag1Set(p)   (((uintptr_t) (p) & FLAG1_BIT) != 0)

【讨论】:

    【解决方案2】:

    试试:

    #define IS_FLAG_1_SET(p)                \
    {                                       \
         (((uintptr_t) p & FLAG1_BIT) != 0) \
    }
    

    【讨论】:

    • 这里的括号完全错误。我们需要一些可以在if(IS_FLAG_1_SET(p)) 语句中使用的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多