没有优化的清零内存

Afs*_*hin 5 c++

如您所知,如果稍后不访问memset()内存,我们不能将其用于清零,因为它可能会被编译器优化。我看到了一个建议,在CPP参考,我们可以用一个指针来解决这个问题。现在这是我的问题:std::fillvolatile

  1. 这个语句是否意味着如果指针不是volatilestd::fill也可以优化?
  2. 例如,我们如何获得指向容器的 volatile 指针vector?这样的东西有用吗?
vector<int> v;
volatile auto ptr = v.data();
Run Code Online (Sandbox Code Playgroud)

olm*_*olm 3

是的,这会起作用:

volatile int* ptr = vec.data();
std::fill(ptr, ptr+vec.size(), 0);
Run Code Online (Sandbox Code Playgroud)

阻止编译器对其进行优化的一件事是关键字volatile(这基本上是该关键字的全部目的),因此带有非易失性指针的 std::fill 也将被优化。

由于 memset 被定义为采用非易失性指针,因此即使您向其传递易失性指针,也可以对其进行优化(在这种情况下,您还需要该标志来-fpermissive允许编译器将易失性指针转换为非易失性指针)指针 - 否则它将无法编译)。

我做了一个关于可能性的小例子,这使得它非常明显:https://godbolt.org/z/xqYG1Ksod
(请注意,我使用原始数组而不是向量,因为向量构造函数会向asm 输出)。

  • 来自上面 Jarod42 的评论:请注意,“volatile auto ptr = v.data();”会生成“int* volatile”,而不是“int volatile*”(或“volatile int*”)。 (4认同)