前言

C++17增加了std::string_view它在很多情况会优于使用std::string

尤其是用做函数形参的时候,使用std::string_view基本一定优于老式的const std::string&这种写法。

了解std::string_view

在讲述它的优越性之前,我们应该先介绍一下它。

首先,它顾名思义,就是一个字符串视图,它和std::string不一样,不是一个可变的字符串类型。

它只是用来指代“字符串”(这个字符串可以指代的东西很多)的,并不拥有所有权,自然也不可变

通常实现只保有两个数据成员:一个指向字符串的指针,一个表示字符串的的size(通常是size_t类型)。

通常64位系统下大小为16个字节。

了解std::string

class string {//简单示例,实际不可能如此
public:
// all 83 member functions
private:
char* m_data;
size_type m_size;
size_type m_capacity;
std::array<char, 16> m_sso;
};

对于 64 位系统,每个字符串std::string有 24 个字节的“开销”(sizecapacitydata),另外还有 16 个字节用于 SSO 缓冲区。

加起来也就是40。

实际使用

老式写法

void func(const std::string&s){
std::cout << s << '\n';
}

看起来没有任何问题,但其实在很多传参调用的情况下,开销是很大的。

std::string s{"乐呵"};
func("乐呵");
func(s);

你觉得上面哪个调用,谁的开销更大

func("乐呵");,这里我们传入的是字符串字面量,它和std::string不是一个类型,这里实际上需要调用std::string的转换构造函数,在当前构造出一个临时的std::string对象,也就是一个纯右值表达式。

const std::string&可以接纯右值表达式,没问题,并且延长临时对象的生存期,可以在函数局部使用。

const char* p = "乐呵";
func(p);//传指针也和上面说的差不多。

另外,使用const std::string&还更容易造成一些bug,比如:

 const std::string& f(const std::string& str) {
return str;
}
int main() {
auto& ret = f("哈哈");
std::cout << ret << '\n';
}

const std::string& str接纯右值表达式是没问题。但是它最后还想返回这个对象的引用,就不对了。

在函数调用中绑定到函数形参的临时量,存在到含这次函数调用的全表达式结尾为止:如果函数返回一个生命长于全表达式的引用,那么它会成为悬垂引用。

使用std::string_view

void func(std::string_view s){
std::cout << s << '\n';
} int main(){
std::string s{"乐呵"};
const char* p = "乐呵";
func("乐呵");
func(s);
func(p);
}

std::string有一个到std::string_view转换函数,其他的都是正常走std::string_view的构造函数

std::string_view 只是一个视图,用来指代原字符串的,保有一个size和一个指针即可。

新增加的库基本上不会再以const std::string&这种作为形参,比如std::formatstd::vformat

总结

如果你能用std::string_view,那么请使用。至少在用作接口的时候,一定是。

【库函数】在什么时候使用 string_view 代替 string的更多相关文章

  1. 【C语言】模拟实现库函数strcat函数

    //模拟实现库函数strcat函数 #include <stdio.h> #include <string.h> #include <assert.h> char ...

  2. C++中把string转成char

    c_str函数的返回值是const char*的,不能直接赋值给char*, c++语言提供了两种字符串实现,其中较原始的一种只是字符串的c语言实现. 与C语言的其他部分一样,它在c+的所有实现中可用 ...

  3. C++17剖析:string_view的实现,以及性能

    主要内容 C++17标准发布,string_view是标准新增的内容.这篇文章主要分析string_view的适用范围.注意事项,并分析string_view带来的性能提升,最后从gcc 8.2的li ...

  4. C++数值类型与string的相互转换

    转自:https://www.cnblogs.com/johngu/p/7878029.html 1.数值类型转换为string 1.1使用函数模板+ostringstream 使用函数模板将基本数据 ...

  5. C++.【转】C++数值类型与string的相互转换

    1.C++数值类型与string的相互转换 - JohnGu - 博客园.html(https://www.cnblogs.com/johngu/p/7878029.html) 2. 1.数值类型转换 ...

  6. string与char*的转换方法

    c_str函数的返回值是const char*的,不能直接赋值给char*,所以就需要我们进行相应的操作转化,下面就是这一转化过程. c++语言提供了两种字符串实现,其中较原始的一种只是字符串的c语言 ...

  7. 5. 常见C语言字符串库函数的使用及实现

    1. strncat 函数: [函数原型]#include <string.h> char *strncat( char *str1, const char *str2, size_t c ...

  8. Python网络编程(2)——socket模块(2)

    目录: 1. 异常 2. 地址族 3. 套接字类型 4. 模块方法 5. Socket对象与实例方法 socket模块提供了Python中的低层网络连接接口,用于操作套接字操作. 异常 socket模 ...

  9. memcpy、memmove、memset及strcpy函数实现和理解

    memcpy.memmove.memset及strcpy函数实现和理解 关于memcpy memcpy是C和C++ 中的内存拷贝函数,在C中所需的头文件是#include<string.h> ...

  10. Linux 内核开发—内核简单介绍

    内核简单介绍 Linux 构成 Linux 为什么被划分为系统空间和内核空间 隔离核心程序和应用程序,实现对核心程序和数据的保护. 什么内核空间,用户空间 内核空间和用户空间是程序执行的两种不同的状态 ...

随机推荐

  1. JavaWeb开发-CSS基础

    2.CSS层叠样式表基本语法 层叠样式表,用来控制页面的样式 (1)CSS的三种引入方式 内部样式表:适合学习使用,将CSS代码写在style标签里面,style标签嵌套在title里 外部样式表:开 ...

  2. MacOS|matplotlib 无法显示中文 解决办法

    matplotlib 无法显示中文 解决办法 画图时,中文无法正常显示,如图 下载字体 点击这里获取字体 提取码: wnby 查看字体路径 在 python 环境中执行以下指令 import matp ...

  3. [ARC165E] Random Isolation

    Problem Statement There is a tree with $N$ vertices numbered $1$ to $N$. The $i$-th edge connects ve ...

  4. [CF1599A] Weights

    题目描述 You are given an array $ A $ of length $ N $ weights of masses $ A_1 $ , $ A_2 $ ... $ A_N $ . ...

  5. shopify主题模板速度优化

    前两天一位新客户说他的shopify店铺加载速度很慢,首页完全加载需要 5~6 秒甚至更高,问ytkah有没办法帮忙优化一下.shopify网站速度优化要看具体用了什么模板,有什么功能,哪些可以改哪些 ...

  6. 【云原生 | Kubernetes 系列】—K8S部署RocketMQ集群(双主双从+同步模式)

    [云原生 | Kubernetes 系列]-K8S部署RocketMQ集群(双主双从+同步模式) 版权 本文为云录原创文章,转载无需和我联系,但请注明来自云录 https://www.yunzhuan ...

  7. 快速上手 dbt 数据转换工具 -- dbt core 命令进阶篇

    引 根据第一篇文章的约定,我想通过接下来的几篇文章带大家进一步了解 dbt 的用法,原计划这篇文章我会介绍 dbt 命令的进阶用法,进一步认识 dbt 的配置以及如何创建增量表等等零零散散十几个方面的 ...

  8. [西湖论剑2023-Misc] 复现

    MISC mp3 题目 我的解答: 010发现mp3藏有png图片 卡里分离得到图片 foremost cipher.mp3 zsteg发现里面有压缩包 提取出来 zsteg -e b1,r,lsb, ...

  9. nginx在代理到upstream时转换http1.1为http1.0,长连接转为短连接

    nginx在代理到upstream时的默认行为 最近准备用openresty替换nginx,替换的效果当然是需要保证效果和nginx一致,不然可能就会导致线上在用的服务出现问题. 替换成openres ...

  10. vscode 启动go

    { "version": "0.2.0", "configurations": [ { "name": "La ...