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

时间:2016-03-10 17:02:47

标签: c++ memory optimization

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

考虑以下示例:

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

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

我可以信任它来清理敏感数据吗?

2 个答案:

答案 0 :(得分:2)

我不认为优化可以在这里发挥任何技巧。在这种情况下,标准强制执行值初始化:new(pointer) char[size]{},因此在pointer指向的调用内存之后将填充0。

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

答案 1 :(得分:2)

我不确定这是您的问题的答案还是只是旁注但您可以使用optimize()编译器指令

禁用该特定函数的优化
void* __attribute__((optimize("O0"))) clean(void* pointer, std::size_t size) {
    // unmodifiable compiler code
}

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