最近,我对跟踪内存分配和释放产生了兴趣。当重载new和delete运算符时,我发现C++标准库有时会调用重载运算符,但有时会使用其他方法来分配内存(可能是std::allocator
)。例如,std::string
似乎没有使用new
。尽管std::vector
在调用push_back
时似乎会调用new
。这很令人惊讶,因为我认为标准库应该有一致的内存分配管理策略。
标准库何时选择使用new
,何时选择使用std::allocator
?为什么?
最近,我对跟踪内存分配和释放产生了兴趣。当重载new和delete运算符时,我发现C++标准库有时会调用重载运算符,但有时会使用其他方法来分配内存(可能是std::allocator
)。例如,std::string
似乎没有使用new
。尽管std::vector
在调用push_back
时似乎会调用new
。这很令人惊讶,因为我认为标准库应该有一致的内存分配管理策略。
标准库何时选择使用new
,何时选择使用std::allocator
?为什么?
std::allocator
。malloc
。
std::string
不会(间接)调用new
的依据是什么?你认为std::allocator
不会使用new
,或者std::vector
不会使用std::allocator
的依据又是什么?你知道短字符串优化吗? - Sneftelstd::allocator
也使用operator new
来分配内存。无论如何,正如已经指出的那样,您很可能是 SSO 的受害者。这意味着std::string
不需要为短字符串(通常在 64 位架构上为 15 或 22 个字符)分配内存。 - Daniel Langrstd::allocator
(标准容器默认使用的模板化分配器)使用::operator new(size_t)
或(自 C++17 起)::operator new(std::size_t, std::align_val_t)
。该函数何时以及如何调用是未指定的(这允许容器和分配器为它们分配和管理内存的策略进行定制)。 - Peterstd::allocator
被引入的原因是在旧时代,x86 处理器有两种指针类型:near 和 far。这个视频可能会有所帮助:https://youtu.be/LIb3L4vKZ7U - Marek R