是否保证C++标准库容器调用可替换的新函数?

Bee*_*ope 22 c++ language-lawyer c++11

如果我替换所有operator new我可以签名的签名,至少在我测试的实现上,我看到标准容器调用我的替换版本来分配内存.

这是否由标准保证?也就是说,实现使用优化版本是不合法的,该版本没有将我的替换函数称为标准容器下的内存?

Bri*_*ian 27

对于分配感知的容器,如默认分配器std::vector<T>std::allocator<T>.此类模板在标准的[default.allocator]部分中描述.根据C++ 14中的[allocator.members]/6:

存储是通过调用获得的 ::operator new(std::size_t)

因此全局运营商new是您需要更换的运营商.如果你operator new特意T重载,那么默认分配器将不会使用该重载.

  • 因此,即使在`new`和`malloc`兼容的平台上,`std :: vector`实现实际上使用`calloc`也是违法的,除非库+编译器可以检测/证明` :: operator new(std :: size_t)`还没有被覆盖?(在这种情况下,as-if规则应该允许它进行整个程序优化).["未指定何时以及如何`new`被称为"语言足以优化或合并某些分配](http://en.cppreference.com/w/cpp/memory/allocator/allocate),但不会允许完全绕过"新",对吧? (2认同)

R S*_*ahu 7

这是否由标准保证?

只要您不使用自定义分配器来创建容器的实例,我相信这是真的.

来自http://en.cppreference.com/w/cpp/memory/allocator

std::allocator类模板是如果没有提供用户指定的分配器由所有标准库容器使用的默认分配器.

来自http://en.cppreference.com/w/cpp/memory/allocator/allocate:

n * sizeof(T)通过调用分配未初始化存储的字节::operator new(std::size_t)