C ++中的字符串

问题描述 投票:8回答:9

我对C ++中的字符串有以下疑问

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

1。

string a;
a = "hello!";

OR

2。

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

2 >>

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

当将较大的字符串复制到较小的字符串时,在c ++中如何精确地处理内存管理? C ++字符串可变吗?

c++ string mutable
9个回答
8
投票

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

string a;
a = "hello!";

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

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

调用new需要OS和内存分配器找到可用的内存块。太慢了然后立即对其进行初始化,因此不会像在第一个版本中那样分配两次任何内容,也不需要重新调整缓冲区的大小。然后发生了一些不好的事情,您忘记了调用delete,并且内存泄漏,另外分配给一个非常慢的字符串。所以这很糟糕。

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

[在第一种情况下,您首先初始化一个以包含空字符串。然后,您分配一个新字符串,然后再分配一个。每个这些[[may都需要调用new来分配更多的内存。每行还需要长度,可能还需要分配其他内部变量。

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

string a = "hello";

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

它还可以最大程度地减少错误,因为在程序中的任何地方都没有多余的空字符串。如果字符串存在,则包含所需的值。

关于内存管理,google RAII。简而言之,字符串在内部调用new / delete以调整其缓冲区大小。这意味着您

never

需要分配一个带有new的字符串。字符串对象的大小是固定的,并且被设计为在堆栈上分配,以便析构函数超出范围时会被调用[。然后,析构函数保证释放所有已分配的内存。这样,您不必在用户代码中使用new / delete,这就不会泄漏内存。

14
投票
string * s = new string("hello");

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

int * i = new int(42);

您应该说

string s( "hello" );

string s = "hello";

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


4
投票
string a = "Hello";

等?这避免了默认构造,并且从语义上来说更有意义。仅为了将字符串分配到堆上而创建指向字符串的指针永远是没有意义的,即您的情况2毫无意义,效率稍低。

关于您的最后一个问题,是的,除非声明为const,否则C ++中的字符串是可变的。>>

2
投票

0
投票
成员

0
投票

0
投票

0
投票

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.