如果我在块中写入字符串文字,是否会从数据部分复制整个字符串数据?
If I write a string literal in a block, will the entire string data be copied from data section?
例如,
{ // local stack frame C
cout << "AAAAA" << endl;
cout << "AAAAA" << endl;
cout << "BBBBBBBBBB" << endl;
cout << "BBBBBBBBBB" << endl;
}
此处,编译时在数据段中创建了两个字符串(大小为 6 的字符串 A 和大小为 11 的字符串 B)。
如果我像上面那样在一个块中写一个字符串文字,
数据段中的字符串A和B在编译时被两个复制到本地栈帧C中。
所以 6 * 2 + 11 * 2 = 34.
一共会占用34个字节的本地栈内存。
我理解的对吗?
字符串未复制到本地堆栈帧。相反,您只是将指向具有静态存储持续时间的字符串文字的指针传递给 cout <<
。由于此指针在编译时具有固定值,因此在编译时也不太可能占用任何堆栈内存。
堆栈帧通常也是按函数定义的,而不是按块定义的。
如果将要显示的块编译为启用了优化的函数,那么它可能不会对局部变量或临时变量使用任何堆栈space。
例如,
{ // local stack frame C
cout << "AAAAA" << endl;
cout << "AAAAA" << endl;
cout << "BBBBBBBBBB" << endl;
cout << "BBBBBBBBBB" << endl;
}
此处,编译时在数据段中创建了两个字符串(大小为 6 的字符串 A 和大小为 11 的字符串 B)。
如果我像上面那样在一个块中写一个字符串文字,
数据段中的字符串A和B在编译时被两个复制到本地栈帧C中。
所以 6 * 2 + 11 * 2 = 34.
一共会占用34个字节的本地栈内存。
我理解的对吗?
字符串未复制到本地堆栈帧。相反,您只是将指向具有静态存储持续时间的字符串文字的指针传递给 cout <<
。由于此指针在编译时具有固定值,因此在编译时也不太可能占用任何堆栈内存。
堆栈帧通常也是按函数定义的,而不是按块定义的。
如果将要显示的块编译为启用了优化的函数,那么它可能不会对局部变量或临时变量使用任何堆栈space。