可以放置新的生存优化,不像内存集

Can placement new survive optimization, unlike memset?

本文关键字:优化 内存      更新时间:2023-10-16

所以我真的很好奇它是否能在GCC和clang采用的积极优化策略中幸存下来。

考虑以下示例:

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。

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

我不确定这是对您的问题的答案还是只是一个旁注,但您可以使用编译器指令禁用对该特定函数optimize()优化

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

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