我们假设我有一个使用用户名和权限标识符构造的Permission类。此权限类的构造函数将检查用户是否具有该特定权限,如果没有则抛出。
在api请求处理程序中,这些权限对象是堆栈变量,并使用用户和权限构造。如果该用户没有权限,我希望抛出。
是否可以保证这些权限对象不会被优化,因为我只是构造它们但从不再使用它们(如果权限被拒绝,它们需要抛出)?
答案 0 :(得分:2)
是。优化按照as-if规则进行。该程序必须表现得好像它在兼容的C ++实现上运行。现在,特定的“兼容行为”可能并不总是您对实际硬件的期望。例如。对于CPU模型,空循环的速度可能太快,因为循环已经过优化。
但是,每个实现必须表现为,就像它调用构造函数一样。这确实包括内联构造函数(在程序集中没有函数调用),但ctor的实际内容,如控制台I / O,仍然必须发生
答案 1 :(得分:1)
是否可以保证这些权限对象不会被优化,因为我只是构造它们但从不再使用它们(如果权限被拒绝,它们需要抛出)?
我认为是的,按照“as-if-rule”(同样的保证适用于同样通常使用的std::lock_guard
)。
一定要添加一些注释(因为只有副作用的构造函数可能会非常令人惊讶,特别是如果构造函数通常不会做任何有用的事情,除非抛出一些异常)。
该回答的前一版本 volatile
提及的{<1}}
BTW,编译器不应该LTO优化这样的代码,但这可能是一个不常见的情况,所以你可能会检查它们不是。
答案 2 :(得分:1)
是。优化主要基于“as-if-rule”,这意味着只要结果表现得好像编译器严格遵循标准而没有进行任何优化,编译器就可以做任何想做的事情。
有问题的优化会改变行为(抛出异常与未抛出异常),因此不允许这样做。当然,除非您在代码中有一些UB,因为严格遵循标准变得无关紧要(无论如何都无保证)。