C++字符串选择:string vs const char* 性能对比 | 最佳实践

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* 作为参数传递过去会被截断的,也就不符合需求