我有以下宏,
#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)有问题。编译器保留表达式不透明(或非纯)的代码。这些实际上是编译器无法从中获取提示的确切表达式。
我想停止编译器执行(2)或在这种情况下生成警告。
答案 0 :(得分:2)
否,您不能使assert
忽略可能包含副作用(例如函数调用)的条件,这是不能将其用作优化提示的主要原因。
您需要修改编译器前端才能获得这种功能(我之前here已经为此提交了GCC补丁)。