poi*_*ter 17 c++ memory heap stack stdstring
int main(void)
{
std::string foo("foo");
}
Run Code Online (Sandbox Code Playgroud)
我的理解是上面的代码使用默认的allocator来调用new.因此,即使在堆栈上分配了std :: string foo,foo中的内部缓冲区也会在堆上分配.
如何创建完全在堆栈上分配的字符串?
Eri*_*ski 22
我最近想自己做这件事并发现以下代码:
它定义了一个新的std::allocator,它可以为STL容器的初始存储分配提供基于堆栈的分配.我找到了一种不同的方法来解决我的特定问题,所以我实际上并没有自己使用代码,但也许它对你有用.请务必阅读代码中有关使用和警告的注释.
对于那些质疑这样做的实用性和理智性的人,请考虑:
有些人评论说,使用基于堆栈的分配的字符串不会std::string像某种方式那样削弱它的效用.没错,你不能互换地使用这两个,所以你将无法将你stackstring的功能传递给期望的std::string.但是(如果你这样做是正确的),你就可以用你的所有相同的成员函数stackstring,你现在上使用std::string,如find_first_of(),append()等 begin(),并end()仍将正常工作,那么你就可以使用许多STL算法.当然,它不会std::string在最严格的意义上,但在实际意义上它仍然是一个"字符串",它仍然是非常有用的.
Ste*_*sop 11
问题是std::basic_string具有分配器的模板参数.但std::string它不是模板,也没有参数.
所以,原则上你可以使用一个std::basic_string在堆栈上使用内存的分配器的实例化,但它不会是一个std::string.特别是,您不会获得运行时多态性,并且您无法将结果对象传递给期望a的函数std::string.