忽略C++中断言表达式中的副作用
Ignore side-effects in asserted expression in C++
我有以下宏,
#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)或在出现这种情况时生成警告。
否,不能使assert
忽略可能包含副作用的条件(例如函数调用),这是它们不能用作优化提示的主要原因。
您需要修改编译器前端才能获得这种功能(我不久前在这里提交了一个GCC补丁)。
相关文章:
- (C++)分析树以计算返回错误值的简单算术表达式
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 提升精神:解析布尔表达式并简化为规范范式
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 使用正则表达式regex_search在字符串中查找字符串
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 概念中的cv限定符需要表达式参数列表
- 为什么constexpr的性能比正常表达式差
- 对于结构,表达式必须是可修改的ivalue
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 将fold表达式与std::一起用于两个元组
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- 标记 '","' 之前的预期主表达式
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- 如何计算具有指定类型的表达式的相对精度和绝对精度
- 带有用户定义类的c++折叠表达式
- 条件断点:此表达式具有副作用,不会计算
- 在同一表达式内使用副作用的结果是安全的
- 是否应该对没有副作用的已丢弃值表达式进行诊断
- 忽略C++中断言表达式中的副作用