C风格字符串和C++ string 对象赋值操作的性能比较

<<C++ Primer>> 第四版 Exercise Section 4.3.1 部分Exercise 4.2.9 习题如下:

在自己本机执行如下程序,记录程序执行时间:

 1 #include "stdafx.h"
 2 #include <iostream>
 3 #include <string>
 4 #include <vector>
 5 #include <ctime>
 6
 7 using namespace std;
 8
 9 int main()
10 {
11     clock_t start, end;
12     start = clock();
13     const char *pc = "a very long literal string";
14     const size_t len = strlen(pc);
15     cout << "the length of pc is: " << len << endl;
16     for (size_t ix = 0; ix != 10000; ++ix)
17     {
18         char *pc2 = new char[len+1];
19         strcpy_s(pc2,len+1,pc);
20         if (strcmp(pc, pc2))
21         {
22             // do nothing
23         }
24         delete[] pc2;
25     }
26
27     end = clock();
28     cout << "for c style operation : " << (end - start) << endl;
29
30     clock_t start1, end1;
31     start1 = clock();
32     string str("a very long literal string");
33     for (int ix = 0; ix != 10000; ++ix)
34     {
35         string str2 = str;
36         if (str != str2)
37         {
38
39         }
40     }
41     end1 = clock();
42     cout << "for c++ string operation : " << (end1 - start1) << endl;
43     return 0;
44 }

其中时间记录的代码是我自己加的,用于分别记录C风格字符串和C++ string对象赋值操作的执行时间。执行结果如下:

c++ string 对象的赋值操作耗时明显比c风格字符串要长很多,但是从书上的结论来说,c++ string的操作要远比c风格字符串长。所以这里记录下,以后研究标准库时,分析代码来找原因。

时间: 2024-10-01 13:14:25

C风格字符串和C++ string 对象赋值操作的性能比较的相关文章

string 对象及其操作

标准库类型string 标准库类型string表示可变长的字符序列,使用string类型必须首先包含string头文件.作为标准库的一部分,string定义在命名空间std中.接下来的示例都假定了已包含了下述代码: #include <string> using std::string; 本节描述最常用的string操作. 定义和初始化string对象 如何初始化类的对象是由类本身决定的.一个类可以定义很多种初始化对象的方式,只不过这些方式之间必须有所区别:或者是初始值的数量有所区别,或者是初

字符和字符串字面值以及string对象

'A'     // 字符字面值. "A"    // 字符串字面值,它的结尾处隐含一个空字符('\0'代表字符串结束),它的实际长度为2. string s1 = "A";   // 字面值中除了最后的空字符的其他内容都被拷贝到新创建的字符串即s1中了,s1的长度为1!

string对象和C风格代码的混用

我们都知道可以用已下方式来初始化string对象: string  s("hello world!"); 实际上我们也可以通过这样的方式来实现: char c[] = {'h','e','l','l','o','  ','w','o','r','l','d','!','\0'}; string s = c; 但是如果数组c不是以空字符结尾的话,那么上面的赋值就是不正确的. 实际上,任何出现字符串字面值(即上面的"hello world!"这种形式)的地方都可以用以空

C风格字符串

尽管C++支持C风格字符串,但在C++程序中最好还是不要使用它们.这是因为C风格字符串不仅使用起来不太方便,而且极易引发程序漏洞,是诸多安全问题的根本原因. 字符串字面值是一种通用结构的实例,这种结构即是C++由C继承而来的C风格字符串.C风格字符串不是一种类型,而是为了表达和使用字符串而形成的一种约定俗成的写法.按此习惯书写的字符串存放在字符数组中并以空字符串结束.以空字符结束的意思是在字符串最后一个字符后面跟着一个空字符('\0').一般利用指针来操作这些字符串. C标准库String函数

cin读入string对象

cin 1.cin>> 1.以空格,回车,换行分隔 2.如果第一个为上述"分隔符",cin会自动忽略并清除,等待数据继续输入 3.cin>>noskipws>>input可以不略过空白字符 2.cin.get A.读取一个字符 a=cin.get();cin.get(a); 不忽略分隔符 B.读取一整行 cin.get(a,size);遇到分隔符是结束 Note: 只能将字符串读入c风格的字符串中,即char*类,而getline类型可以读入c++风

string对象操作以及stringstream

标准string对象支持长度可变的字符串操作.使用它需要包含头文件,它位于std命名空间下. 1.string对象的定义和初始化 string s1; //默认构造函数,s1为空串 string s2(s1); //将s2初始为s1的一个副本 string s3("value"); //将s3初始为一个字符串字面值的副本 string s4(n,'c'); //将s4初始为字符串'c'的n个副本 需要注意的一点是从s3的构造方式中注意字符串常量和string对象的不同,因为有这种构造方

Java中List&lt;E&gt;对象赋值问题(深浅拷贝)

Java中List<E>对象赋值操作问题 业务需求是:取2个集合中的交集对象并返回.如下代码,busMap中key值和stocks中Map中的key值相等的对象则返回继续操作,也就是说剔除stocks中的不存在于busMap中的对象,就是一个过滤操作. 实现代码 ① bug版报错:java.util.ConcurrentModificationException ; at java.util.ArrayList$Itr.checkForComodification(ArrayList.java

c++ string类型相关操作

1. 定义和初始化string对象 string s: 默认初始化,s是一个空字符串. string s = “hello”:  或者string s(“hello”): 或者string s2(10, s1)拷贝s1的前10个字符到s2中. s的内容是  “hello” s.empty( ) 为空返回true. s.size()返回字符个数. 返回值是string::size_type类型的值,size_type属于unsigned类型,能够存放下任何string对象的大小,一般用unsign

C++String类关键操作简介

1.string 类的头文件 #include<string> using std::string; 2.string 类的构造函数 string s1; //默认的构造函数,s1为空串 string s2(s1); //将s2初始化为s1的一个副本,对s2的操作不会影响s1 string s3("value"); //将s3初始化为一个字符串字面值的副本 string s4(n,'c'); //将s4初始化为字符c的n个副本 3.string 对象的读写 cin >