c++ - 如果我在 block 中写入字符串文字,是否会从数据部分复制整个字符串数据?

标签 c++ virtual-memory string-literals

例如,

{ // local stack frame C
     cout << "AAAAA" << endl;
     cout << "AAAAA" << endl;
     cout << "BBBBBBBBBB" << endl;
     cout << "BBBBBBBBBB" << endl;
}

此处,编译时在数据段中创建了两个字符串(大小为 6 的字符串 A 和大小为 11 的字符串 B)。
如果我像上面那样在一个 block 中写一个字符串文字,
数据段中的字符串A和B在编译时被两个复制到本地栈帧C中。
所以 6 * 2 + 11 * 2 = 34。
一共会占用34个字节的本地栈内存。

我理解的对吗?

最佳答案

字符串不会复制到本地栈帧。相反,您只是将指向具有静态存储持续时间的字符串文字的指针传递给 cout << .由于此指针在编译时具有固定值,因此在编译时也不太可能占用任何堆栈内存。

栈帧通常也是按函数定义的,而不是按 block 定义的。

如果您将要显示的 block 编译为启用了优化的函数,那么它可能不会为局部变量或临时变量使用任何堆栈空间。

关于c++ - 如果我在 block 中写入字符串文字,是否会从数据部分复制整个字符串数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59310065/

相关文章:

c++ - 字符串文字的本地化

c++ - CString.Replace 替换多个字符

linux - Windows/Linux x64 如何确定上次访问内存页的时间?

c++ - 比较 C++ 中的字符数组和字符串文字

c++ - C++ 中各种数据类型的 sizeof() 解释

macos - LLDB和库函数的内存地址

c++ - 如何构建一个好的基于模板的 C++ 库?

c++ - 排序 vector 的交集

c++ - 如何同时运行两个线程? Qt C++

Memcached 和虚拟内存