我决定在使用Java一段时间后回到C++,现在我对字符串在C++中的工作方式感到很困惑.
首先,假设我们有一个功能:
void fun() {
int a = 1;
Point b(1,2);
char c[] = "c-string";
}
Run Code Online (Sandbox Code Playgroud)
据我所知,a并b在堆栈上分配.c(指针)也在堆栈上分配,但内容("c-string")在堆上幸福地生活.
Q1:c函数fun结束时是否自动解除分配内容?
其次让我们假设我们有一个c ++ string:
void fun2() {
(1) string s = "c++ string";
(2) s += "append";
(3) s = "new contents";
(4) s = "a" + s + "c";
}
Run Code Online (Sandbox Code Playgroud)
字符串文档对字符串的工作原理并不太具体,所以以下是问题:
Q2:结束s后是否会自动解除分配内容fun2?
问题3:当我们连接两个字符串时会发生什么?我应该关心内存使用情况吗?(第2行)
Q4:当我们覆盖字符串的内容时会发生什么(第3行) - 记忆怎么样?我应该担心吗?最初分配的空间是否重复使用?
Q5:如果我构造一个这样的字符串(第4行),该怎么办?这个很贵吗?是字符串文字("a","c")汇总(如在Java中)还是在最终的可执行文件中重复?
我最终要学习的是如何在C++中正确使用字符串.
感谢您阅读此内容,
Queequeg
据我所知,a和b分配在堆栈上.c(指针)也在堆栈上分配,但内容("c-string")在堆上幸福地存在.
这是错的,它们都存在于自动存储器(堆栈)中.即使是char阵列.在C++中,字符串是类型的对象std::string.
Q1:当函数fun结束时,c的内容是否自动解除分配?
是.
Q2:fun2结束后s的内容是否自动解除分配?
是.
问题3:当我们连接两个字符串时会发生什么?我应该关心内存使用情况吗?(第2行)
它们是连接在一起的,内存是自动管理的.(假设我们正在谈论std::string而不是char[]或char*.
Q4:当我们覆盖字符串的内容时会发生什么(第3行) - 记忆怎么样?我应该担心吗?最初分配的空间是否重复使用?
实施细节.它可以重复使用,如果以前的内存不能保存新内容,则可以重新分配.
Q5:如果我构造一个这样的字符串(第4行),该怎么办?这个很贵吗?字符串文字("a","c")是否汇总(如Java中)或在最终的可执行文件中重复?
字符串文字可以合并,但不是必需的.对于大型连接,通常使用std::stringstream替代(类似于Java).但首先是个人资料,不要过早优化.并非这些都不是字符串文字.
char* pStr = "this is a string literal";
Run Code Online (Sandbox Code Playgroud)
它驻留在只读内存中,无法修改.
我最终要学习的是如何在C++中正确使用字符串.
用一个std::string.
c不是指针.这是一个数组.你可以告诉它它是一个数组,因为它有方括号,而指针有一个星号.由于c是自动变量,因此不需要任何手动寿命或内存管理.
广告Q2:s也是一个自动变量,因为它是一个设计良好的类型,这意味着您不需要手动处理任何事情.
广告Q3:适当修改本地字符串对象以包含新字符串; 在此过程中,在连接表达式的持续时间内可能存在或可能不存在临时字符串对象.(这仅适用于第4行;第2行没有临时性.)
广告Q4:一切都很好,按预期工作; 见Q2.原始内存可能会也可能不会使用,具体取决于分配的详细信息.在您的示例中,原始内存可能会被覆盖; 在这种情况下s = std::string("hello");,两个字符串的缓冲区可能会被交换.
Ad Q5:字符串文字是只读的全局常量,编译器可以按照自己喜欢的方式实现.细节不是那么重要; 你肯定会得到所需的string对象s.请参阅Q3 re临时对象.
要"学习如何在C++中使用字符串",只需去使用它们即可.像整数一样对待它们.这是正确的.标准库的美妙之处在于,您真的不需要知道"工作原理"; 当您以惯用的C++方式使用标准库类时,所有资源管理都会自动且高效地完成.
| 归档时间: |
|
| 查看次数: |
305 次 |
| 最近记录: |