与memset不同,可以放置新的优化吗?

所以我真的很想知道它是否能够在GCC和叮当声中采用激进的优化策略。

考虑下面的例子:

void* clean(void* pointer, std::size_t size) noexcept
{
    return new(pointer) char[size]{};
}

void doStuff()
{
    //...
    clean(pointer, size);
    //...
}

我可以通过清理敏感数据的任务来信任它吗?


我不认为优化可以在这里发挥任何诡计。 在这种情况下,标准强制值初始化: new(pointer) char[size]{} ,所以在这个调用之后, pointer内存将被填充0。

可能是编译器可以优化它,如果你从来不访问新的指针或在accessin之前覆盖它(基于可观察性)。 如果你想避免这种轻微的可能性,你需要将你的指针定义为volatile的指针。


我不确定这是回答你的问题还是只是一个附注,但你可以使用optimize()编译器指令禁用对特定函数的optimize()

void* __attribute__((optimize("O0"))) clean(void* pointer, std::size_t size) {
    // unmodifiable compiler code
}

这将确保您的clean()函数不会被优化

链接地址: http://www.djcxy.com/p/90569.html

上一篇: Can placement new survive optimization, unlike memset?

下一篇: Adjust CSS to make OSX Chrome Print Emoji