我能让GCC在被调用方(定义端)假设前置条件和后置条件成立吗?
我的项目使用一个宏(以及文档注释)来表达函数的前置/后置契约。宏的设计有意如此:如果定义了 NDEBUG,它的展开基本等价于 [[assume(expr)]],否则基本等价于 assert(expr); [[assume(expr)]]。也就是说,我希望在发布构建中编译器假设契约已经得到遵守,而在非发布构建中则对其进行检查。
我在想,在调用方/定义端使用C++契约 能在多大程度上实现同样的行为,以及该如何实现。
如果可能,那就很好;它可以把契约直观地放在函数签名中,减少我通过文档注释来描述契约所需的工作量,并让调用方在自己的端控制契约的检查。
我对这个链接进行了粗略浏览,但没有看到看起来接近我所寻找的内容的东西。我在想是否/希望我错过了什么。
解决方案
目前看来,假设和契约是正交的特性,因此我不相信你能通过例如使用 pre(expr) 而不是 [[assume(expr)]] 来强制编译器进行优化。 在 p2900r14 的 2.3 Features Not Proposed 下:
能够假设一个未检查的契约谓词会被评估为true,并允许编译器基于该假设进行优化,即assume语义
被明确提及。若有的话,论文还提到契约可能会阻止时间旅行优化,因此这一特性似乎更偏向安全性而非性能。
尽管我也在一些社交媒体帖子看到关于C++26 Contracts “giving optimization power”的说法,但截至今天在官方文档中没有找到任何确认。
如果要猜测,选择 ignore 的求值语义具有最大的优化潜力。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。