这是一个功能:
void foo() {
string str = "StackOverflo";
str.push_back('w');
}
Run Code Online (Sandbox Code Playgroud)
当我们在函数内部声明字符串时,它是存储在堆栈还是堆中?为什么?
string foo() {
string str = "StackOverflo";
str.push_back('w');
return str;
}
Run Code Online (Sandbox Code Playgroud)
我们可以返回字符串引用并继续使用程序中的其他位置吗?
R S*_*ahu 29
当我们在函数内声明String时,它是存储在Stack还是Heap?
字符串对象本身存储在堆栈中,但它指向堆上的内存.
为什么?
定义语言使得字符串对象存储在堆栈中.string的构造对象的实现使用堆上的内存.
Wag*_*ota 19
对象str
(它是类的实例std::string
)在堆栈中分配.但是,字符串数据本身可以在堆中分配.这意味着该对象具有指向包含实际字符串的缓冲区的内部指针.但是,如果字符串很小(如本例所示),通常字符串类将具有我们称之为"小字符串优化"的字符串.这意味着std::string
对象本身的大小足以包含字符串的数据,如果它足够小(通常约23个字节+ 1个字节的空终止符)...然后如果内容大于此,则字符串数据将在堆中分配.
通常你可以正常返回你的字符串.C++可以为您处理这个问题.移动语义可以处理此处所需的任何内容,以返回指向原始字符串的相同字符串数据的字符串对象,从而避免执行不必要的副本.
C++中的所有局部变量都是Stack中的存储.甚至本地指针也存储在Stack中.但指针中分配的内存存储在Heap中.
因此,您str
的存储在堆栈中,而其值存储在堆中.因为std::string
使用char
指针来分配你的"stackoverflow"