在C ++

时间:2016-08-03 14:22:31

标签: c++ gcc

我有以下宏,

#define assert(exp) ({ if(! (exp) ) __builtin_unreachable(); })

然而事实证明,一些(少数)表达式生成代码(gcc Redhat 5.2.1-2 -O2 -std = c ++ 17)。

assert(syscall(GET_TID)==tid);

的情况确实如此

我认为通常会出现非纯函数的情况。

我的第二次拍摄:

#define assume(exp) \
  ({ \
    auto __a = [&] () __attribute__((pure)) -> int { \
      return !! (exp); \
    }; \
    if (!__a()) \
      __builtin_unreachable(); \
  })

这意味着要么愚弄编译器,要么认为表达式是纯粹的,以便优化它或者如果不是则产生错误。不幸的是,没有看到改善。

问题。

有没有办法强制编译器优化所有代码。 或者,我可以在编译时检测问题:即表达式是生成代码还是非纯函数。编译/链接错误是可以接受的,但我希望将这些视为最后的手段。

更新:更多解释。

  1. 我希望编译器能够利用表达式中的提示来进一步优化代码。
  2. 我希望在这个地方不要生成额外的代码假设被检查(或者至少能够确认)。
  3. 从简要检查编译器输出。 它在很多情况下非常巧妙地实现了(1),只要表达式对编译器有用且透明(例如变量比较,内联函数调用,没有副作用)。

    有(2)有问题。编译器保留表达式不透明(或非纯)的代码。这些实际上是编译器无法从中获取提示的确切表达式。

    我想停止编译器执行(2)或在这种情况下生成警告。

1 个答案:

答案 0 :(得分:2)

否,您不能使assert忽略可能包含副作用(例如函数调用)的条件,这是不能将其用作优化提示的主要原因。

您需要修改编译器前端才能获得这种功能(我之前here已经为此提交了GCC补丁)。