当前位置:  开发笔记 > 编程语言 > 正文

C++中的字符串

如何解决《C++中的字符串》经验,为你挑选了2个好方法。

我有关于C++中字符串的以下问题

1 >>这是一个更好的选择(考虑性能),为什么?

1.

string a;
a = "hello!";

要么

2.

string *a;
a = new string("hello!");
...
delete(a);

2 >>

string a;
a = "less"; 
a = "moreeeeeee"; 

当更大的字符串被复制到更小的字符串时,如何在c ++中处理内存管理?c ++字符串是否可变?



1> 小智..:

几乎从来没有必要或不希望这样说

string * s = new string("hello");

毕竟,你(几乎)永远不会说:

int * i = new int(42);

你应该说

string s( "hello" );

要么

string s = "hello";

是的,C++字符串是可变的.



2> jalf..:

以下所有内容都是天真的编译器所能做的.当然,只要它不改变程序的行为,编译器就可以自由地进行任何优化.

string a;
a = "hello!";

首先,初始化a以包含空字符串.(将长度设置为0,以及一个或两个其他操作).然后分配一个新值,覆盖已设置的长度值.它可能还必须执行检查以查看当前缓冲区有多大,以及是否应分配更多内存.

string *a;
a = new string("hello!");
...
delete(a);

调用new需要操作系统和内存分配器找到一块空闲的内存.那很慢.然后立即初始化它,因此您不需要分配任何两次或者需要调整缓冲区的大小,就像在第一个版本中那样.然后发生了一些不好的事情,你忘了调用delete,除了一个分配极慢的字符串之外你还有内存泄漏.所以这很糟糕.

string a;
a = "less"; 
a = "moreeeeeee";

与第一种情况一样,您首先初始化a以包含空字符串.然后你分配一个新的字符串,然后另一个.其中每个都可能需要调用new来分配更多内存.每行还需要长度,可能还需要分配其他内部变量.

通常,你会像这样分配它:

string a = "hello";

一行,执行初始化一次,而不是先进行默认初始化,然后分配所需的值.

它还可以最大限度地减少错误,因为程序中的任何位置都没有无意义的空字符串.如果字符串存在,则它包含您想要的值.

关于内存管理,谷歌RAII.简而言之,字符串在内部调用new/delete来调整其缓冲区的大小.这意味着您永远不需要使用new分配字符串.字符串对象具有固定的大小,并且被设计为在堆栈上分配,以便析构函数在超出范围时自动调用.析构函数然后保证释放任何已分配的内存.这样,您不必在用户代码中使用new/delete,这意味着您不会泄漏内存.

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有