前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++中的string_view

C++中的string_view

作者头像
王云峰
发布2023-10-21 16:28:38
3030
发布2023-10-21 16:28:38
举报
文章被收录于专栏:Yunfeng's Simple Blog

C++17标准库里面引入了轻量级的只读字符串表示类型string_view,用来替代const char*const string&,在传入函数的时候减小内存开销(因为string_view类只包含字符串的指针和字符串的长度值,开销小于string类型)。

string_view 定义在头文件<string_view>中。

具体来说,C++17里面引入了模板类basic_string_view类,而string_view是针对char特化的类,如头文件中所表示的:

代码语言:javascript
复制
using string_view = basic_string_view<char>;
using u8string_view = basic_string_view<char8_t>;
using u16string_view = basic_string_view<char16_t>;
using u32string_view = basic_string_view<char32_t>;
using wstring_view   = basic_string_view<wchar_t>;

可以看到针对不同类型的字符数组,都有对应的只读view。 顺便提一下,上述代码中用到的using用法是C++11引入的类型重定义(type alias),可以给类型和函数起别名,下面是官方给的示例用法:

代码语言:javascript
复制
#include <string>
#include <ios>
#include <type_traits>
 
// type alias, identical to
// typedef std::ios_base::fmtflags flags;
using flags = std::ios_base::fmtflags;
// the name 'flags' now denotes a type:
flags fl = std::ios_base::dec;
 
// type alias, identical to
// typedef void (*func)(int, int);
using func = void (*) (int, int);
// the name 'func' now denotes a pointer to function:
void example(int, int) {}
func f = example;
 
// alias template
template<class T>
using ptr = T*; 
// the name 'ptr<T>' is now an alias for pointer to T
ptr<int> x;

string_view 使用方法与string一样,而且可以由string类型对象相互初始化,如下所示:

代码语言:javascript
复制
std::string_view sv1("hello world");
std::string s1(sv1);
std::string_view sv2(s1);

实际测试发现,相同的字符串,string_view 对象的大小确实比string对象要小,比如下面的例子:

代码语言:javascript
复制
#include <iostream>
#include <string_view>

int main() {
	std::string_view sv1("hello world");
	std::string s1(sv1);

	std::cout << "size of string_view: " << sizeof(sv1) << std::endl;
	std::cout << "size of string: " << sizeof(s1) << std::endl;

	return 0;
}

在32位的机器下(x86),输出如下:

代码语言:javascript
复制
size of string_view: 8
size of string: 28

因为string_view 只包含一个指向字符串的指针(*)和一个表示数组大小的整型数值(int),因此总大小是4+4=8。而string是容器类型,内部结构我不太清楚,看输出整体是要比string_view大挺多的。

如果想在C++11的环境下使用C++17才引入的string_view,可以使用谷歌推出的absl库,这个库在C++11的环境下实现了很多C++14,17甚至20里面才提出的新特性,可以尝试一下。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-01-232,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档