gpt4 book ai didi

c++ - 没有优化的清零内存

转载 作者:行者123 更新时间:2023-12-03 16:57:29 24 4
gpt4 key购买 nike

如您所知,我们不能使用 memset()用于清零内存 如果以后不访问因为它可能会被编译器优化。我在 cpp ref 中看到一个建议,我们可以使用 std::fill volatile 指针来解决这个问题。现在这是我的问题:

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

    最佳答案

    是的,这会起作用:

    volatile int* ptr = vec.data();
    std::fill(ptr, ptr+vec.size(), 0);
    阻止编译器对其进行优化的一件事是 volatile关键字(这基本上是该关键字的全部目的),因此 std::fill 与非 volatile 指针也将被优化。
    由于 memset 被定义为采用非 volatile 指针,因此即使您将 volatile 指针传递给它,也可以对其进行优化(在这种情况下,您还需要 -fpermissive 标志以允许编译器将 volatile 指针转换为非 volatile 指针 - 否则将无法编译)。
    我做了一个关于可能性的小例子,这使得它非常明显: https://godbolt.org/z/xqYG1Ksod
    (请注意,我使用了原始数组而不是 vector ,否则 vector 构造函数会向 asm 输出添加更多不相关的噪声)。

    关于c++ - 没有优化的清零内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66980425/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com