C++字符串选择:string vs const char* 性能对比 #
引言 #
在C++开发中,字符串处理是一个常见的需求。本文将深入比较string和const char*两种字符串类型的优缺点,帮助开发者在不同场景下做出合适的选择。
看一些 C++ 项目时,发现有些函数传递的参数类型是 const char*,我在想,为什么一个 C++ 项目要用 char* 指针,用 string 会不会更好?
这篇文章就简单分析一下,函数参数使用 string 还是 const char*,哪个更合适?
两种方式的函数声明如下:
void func(const char* s);
void func(const std::string& s);
当源是 string 时:
void funcstr(const std::string& s) { std::cout << s; }
void funcchar(const char* s) { std::cout << s; }
int main() {
std::string s("fdsfds");
funcstr(s);
funcchar(s.c_str());
return 0;
}
两种方式没啥区别,都能满足需求,性能也差不多。
然而,当源是 “xxxx” 这种普通字符串时:
void funcstr(const std::string& s) { std::cout << s; }
void funcchar(const char* s) { std::cout << s; }
int main() {
funcstr("dsdd");
funcchar("dddd");
return 0;
}
可以分析出来,当传递的是 “xxxx” 这种串时,string 方式会自动创建出个临时对象,临时对象的构造和析构会降低性能。
再一个,string(basic_string)是个封装类,它占用的空间肯定比 const char* 更大,这块我后续详细介绍一下 string 的源码分析吧。
然后总结一下:
const char* 相比于 string 的优点 #
- 适配性更好,C 语言和 C++ 都适用
- 效率更高,当传递的是 “xxxx” 这种串时,string 方式会自动创建出个临时对象,临时对象的创建和销毁也是比较耗费性能的
- 还是效率,string 占用的空间比 const char* 更大
说了一大堆 const char* 的优点,那使用 string 究竟有没有优点呢?
我总结了 string 相比于 const char 的两个优点*:
- 方便,不需要关心是否释放相关内存,不需要担心内存泄漏问题
- 有些 string 是 const char 不能替代的*,比如一个 string 中间有 ‘\0’,使用 const char* 作为参数传递过去会被截断的,也就不符合需求