我刚刚阅读了在 C++ 中执行语句顺序并了解到 C++ 编译器允许重新排序
using Clock = std::chrono::high_resolution_clock;
auto t1 = Clock::now(); // Statement 1
foo(); // Statement 2
auto t2 = Clock::now(); // Statement 3
auto elapsedTime = t2 - t1;
进入
using Clock=std::chrono::high_resolution_clock;
foo(); // Statement 2
auto t1 = Clock::now(); // Statement 1
auto t2 = Clock::now(); // Statement 3
auto elapsedTime = t2 - t1;
并且需要使用类似的东西
template <class T>
__attribute__((always_inline)) inline void DoNotOptimize(const T &value) {
asm volatile("" : "+m"(const_cast<T &>(value)));
}
帮助确保订单。 Rust 编译器是否允许做同样的事情?如果不是,Rust 的哪些规则可以防止这种情况发生?如果是,解决方法是什么?
std::hint::black_box()
,它本质上填补了 C++ 代码中 DoNotOptimize()
的角色。
请注意,这不是保证,只是一个提示(一般来说很难提供这样的保证,而且我认为您的
DoNotOptimize()
也不能保证这一点)。