目前我公司的一个项目重载了全局新建/删除。我测试了一些简短的代码,并重载了全局操作符new。当我使用STL时,我看到重载的new被调用(比如vector等),所以我想知道“new”是否会抑制STL分配器,是否会有一个效率优化?
z31licg01#
所有分配器感知的容器都使用allocator_type的示例进行动态内存管理。实际上,他们通过std::allocator_traits接口间接使用它,但这与解释无关。这意味着全局operator new/operator delete的重载不会直接影响STL容器,但会影响std::allocator,因为它使用全局operator new实现allocate()和allocate_at_least()成员函数,并使用全局operator delete实现deallocate()成员函数。由于STL分配器感知容器使用std::allocator作为默认分配器,因此通过传递属性,全局operator new/operator delete的重载福尔斯在STL容器上。如果你想避免这种情况,你只需要实现一个自定义的分配器,并始终使用它作为STL分配器感知容器的分配器。
allocator_type
std::allocator_traits
operator new
operator delete
std::allocator
allocate()
allocate_at_least()
deallocate()
1条答案
按热度按时间z31licg01#
所有分配器感知的容器都使用
allocator_type
的示例进行动态内存管理。实际上,他们通过std::allocator_traits
接口间接使用它,但这与解释无关。这意味着全局operator new
/operator delete
的重载不会直接影响STL容器,但会影响std::allocator
,因为它使用全局operator new
实现allocate()
和allocate_at_least()
成员函数,并使用全局operator delete
实现deallocate()
成员函数。由于STL分配器感知容器使用std::allocator
作为默认分配器,因此通过传递属性,全局operator new
/operator delete
的重载福尔斯在STL容器上。如果你想避免这种情况,你只需要实现一个自定义的分配器,并始终使用它作为STL分配器感知容器的分配器。