C++ 字符串赋值差

C++ 字符串赋值差,c++,string,C++,String,方法1和方法2之间有什么区别 #include <iostream> #include <string> using namespace std; int main() { // METHOD 1 std::string name = "testing"; std::string nameC = name; cout << "nameC is : " << nameC << endl; //

方法1
方法2
之间有什么区别

#include <iostream>
#include <string>

using namespace std;
int main()
{
    // METHOD 1
    std::string name = "testing";
    std::string nameC = name;
    cout << "nameC is : " << nameC << endl;

    // METHOD 2
    char nameC1[8];
    const char* name1 = "testing";
    strlcpy(nameC1,name1,sizeof(nameC1));
    cout << "nameC1 is  : " << nameC1 << endl;
 }
#包括
#包括
使用名称空间std;
int main()
{
//方法1
std::string name=“测试”;
std::string nameC=name;
方法> C++
方法2是C

如果程序是C++(如你的问题的C++标签所示),使用方法1:它帮助更容易地编码字符串操作,并允许Objt生命周期的更好灵活性。它也允许与其他C++对象(如集合)更好的互操作性。

< P>使用方法1。


从长远来看,
方法1
是:

  • 更易于使用-您不必手动创建笨重的C-
    string
    实现
  • 更具可读性
  • C++

方法2
是:

  • 更难使用
  • 可读性较差
  • C

至于“更快”,根据您的实现等,
方法或
方法都可以。在上面列出的其他点面前,微小的电位差实际上并不重要。

C++way 在C++中,资源会自动处理。 在这里,字符串可以被视为一种“值类型”,也就是说,像
int
double
,可以安全地复制、修改、返回、作为参数传递等,而不存在风险。它只起作用

RAII部分意味着字符串有一个指向其内容的内部指针(即“测试”)。当您复制字符串时,内容被复制。当您退出作用域时,字符串被销毁,自动清理/取消分配内容。此处没有内存泄漏

存在优化,具体取决于实现。例如,可以有,这意味着上面的副本类似于指针副本。在其他情况下,字符串包含一个小缓冲区,这意味着小字符串不需要堆分配/释放

您的里程数可能会有所不同,但这里的要点是:

  • 拉伊
  • 它只是工作
C路 在C语言中,没有这样的自动行为,所以一切都必须手工完成,一行修改过的代码可能会打断另一行,而编译器不会告诉你

在上面的当前示例中,由于
nameC1
是堆栈上的数组,因此不能返回它。这是一个很大的缺点,但另一方面,这意味着堆上没有分配

C方式的另一个缺点是您必须使用
strlcpy
,因为您不希望缓冲区溢出(例如,如果name1是
“testingtestingtesting”
,而不是
“testing”
),因此您必须提供接收字符串的大小。在这里,使用数组,这几乎很容易,因为
sizeof
将完成此操作(但是将类型从
char
更改为
wchar\t
,并且
sizeof
部分将需要修改…)

但是,如果字符串类型
nameC1
更改为
char*
(例如,因为您希望从函数返回它),那么您可能需要(重新)分配其内存以适应“测试”,这意味着您需要知道
name1
的长度(这可能会很昂贵和/或麻烦),然后,当不再需要它时,不要忘记释放它

因此:

  • 代码是脆弱的,因为它取决于所使用的类型。更改一件事,代码就会被破坏
  • 代码是有限的,因为不能返回堆栈上声明的数组
  • 代码可能已损坏,因为您的接收缓冲区不能容纳超过7+1个字符
结论 上面的C代码非常脆弱

更改一件事,其他的就停止正常工作。例如,将数组更改为指针将破坏strlcpy
,因为它依赖于
大小的
(如果是指针,它将返回错误的值)

即使如此,最终用户也会认为代码已被破坏,因为在C数组中输入的字符数不会超过7个字符加上
\0
,这意味着字符串可能会被截断

<>这些代码在C++版本中不存在:C++代码行自然地处理所有和每种情况。

因此,结论是,您应该在代码中尽可能多地使用
std::string
,因为它将以零成本或边际成本实现自动化


在极少数情况下,当您需要更快的处理时(通常,您希望删除堆分配/释放部分),然后根据需要修改代码(通常通过分配固定大小的缓冲区,接受其限制以交换其优势)如果你在C++中编程,除非你有很好的理由使用C字符串,否则使用C++字符串,即使用方法1而不是方法2。这样的字符串的大小大约是纳秒。为什么我们会注意到速度是否有差异?Char *是一个常见的麻烦来源(当然,程序员不像你那么聪明)。如果删除更快/较慢的断言,我会给出这个+1 1,你不知道哪个平台上的速度更快,所以这是一个没有根据的概括。C++规范不允许STD::String。
std::string name = "testing";
std::string nameC = name;
//METHOD 2**
char nameC1[8];
const char* name1 = "testing";
strlcpy(nameC1,name1,sizeof(nameC1));