考虑以下职能:
void Foo()
{
std::string s = "Hello";
}在上述情况下,字符串在哪里分配?有些页面(比如这)说它在堆上,而微软说它取决于大小。如果我想避免使用new(),那么如何在堆和堆栈中确定这一点呢?
考虑另一个功能:
void Foo2()
{
char *c = "Hello";
}在这种情况下,我假设它在堆栈上,但是当我通过MSVisualC++检查它的程序集时,我认为它就在堆上了。是真的吗?
char c[] = "Hello"在哪里?
我正在使用VC12,但我也想知道g++是怎么回事。
因为异常处理很重要。因为在展开堆栈的情况下,如果数据是在堆上创建的,那么数据就会丢失,另一方面,没有问题,但是堆栈可能太大了。
发布于 2014-09-15 12:49:32
void Foo()
{
std::string s = "Hello";
}执行受抚养人
如前所述,MSVC的标准库将分配给堆用于大字符串,本地存储(堆栈)用于较小的字符串。
它的存储方式将根据您使用的标准库的平台/版本而有所不同。存储不是在C++规范中定义的,只是功能。
void Foo2()
{
char *c = "Hello";
}指针c位于堆栈上,但实际数据是只读的,而不是堆栈或堆中的数据。
它实际上存储在内存中的只读数据块中。
void Foo3()
{
char c[] = "Hello";
}数组c存储在堆栈上。初始化它时,使用与Foo2()中相同来源的字符串"Hello“创建它。但是,由于c在堆栈中,*c指向可以修改的数据。
发布于 2014-09-15 12:50:49
std::string管理自己。在守则中:
void foo() {
std::string s = "Hello";
}s是堆栈变量。如何存储字符串"Hello"取决于您不需要担心它--除非您的特定STL实现是错误的,否则一切都会得到解决。
在:
void bar() {
char* c = "Hello";
}您已经声明了指向文本字符串"Hello"的本地指针。这取决于编译器的去向,但很可能是在内存的只读段中。值得注意的是,在本例中,字符串"Hello“在C++98中是一个常量,试图修改它在技术上是不可取的(我相信C++11中有一个彻底的错误)。
在:
void baz() {
char c[] = "Hello";
}整个字符串"Hello";存储在本地的6个元素字符数组中(即在堆栈上)。
在大多数情况下,使用std::string的解决方案更可取。
https://stackoverflow.com/questions/25848264
复制相似问题