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

bit*_*ift 7 c++ memory optimization

所以我真的很感兴趣它是否能够在GCC和clang采用的激进优化策略中存活下来.

考虑以下示例:

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

void doStuff()
{
    //...
    clean(pointer, size);
    //...
}
Run Code Online (Sandbox Code Playgroud)

我可以相信清理敏感数据的任务吗?

Ser*_*eyA 2

我认为优化不会对你起任何作用。在这种情况下,标准要求初始化值:new(pointer) char[size]{},因此在此调用之后, by 指向的内存pointer将被填充为 0。

如果您在访问之前从未访问新指针或覆盖它(基于可观察性),则编译器可能可以对其进行优化。如果您想避免这种轻微的可能性,您需要将指针定义为指向 的指针volatile

  • 优化器可以做任何对程序没有明显影响的事情。如果它可以确定该对象不会被使用,并且构造函数没有副作用,那么它完全有权利完全跳过构造函数。 (3认同)