当前位置: 首页 > news >正文

张家界网站制作与代运营常州微信网站建设

张家界网站制作与代运营,常州微信网站建设,多语言版本的网站,wordpress去掉评论界面一、std::string_view简介 std::string_view是C17引入的一种轻量级的字符串视图类,它提供了一个字符窜的只读视图,而不需要进行内存和复制。它仅持有一个指向字符串数据的指针和一个表示字符串长度的整数,具有如下特点: 只读访问…

一、std::string_view简介

std::string_view是C++17引入的一种轻量级的字符串视图类,它提供了一个字符窜的只读视图,而不需要进行内存和复制。它仅持有一个指向字符串数据的指针和一个表示字符串长度的整数,具有如下特点:

  • 只读访问:std::string_view的方法都不会修改原有的字符串,也不会真正的分配内存保存字符串的一部分或者全部。
  • 不拥有字符串数据的所有权:该特性本身不分配内存存储字符串数据。
  • 零拷贝:不会产生字符串的复制拷贝,所以不会产生拷贝这种额外开销。
  • 轻量级:通常只包含一个指针和一个长度,开销很小。
  • 灵活性:可以同时处理C风格字符串、std::string和字符数组。

二、性能提升分析

(一)避免不必要的内存分配和复制操作

std::string_view避免了不必要的内存分配和复制操作,从而提高了性能。例如,在函数参数传递中,使用std::string_view无需进行内存拷贝,而std::string可能涉及深拷贝,这使得std::string_view在参数传递开销上极低。

(二)高效的函数参数传递

std::string_view在函数参数传递中表现出色,特别是在需要频繁传递字符串的场景中。由于它不涉及数据的复制,因此可以显著减少内存使用和提高处理速度。

(三)字符串解析与处理

在解析文本文件或处理网络数据流时,std::string_view可以避免创建大型的字符串拷贝,从而提高程序的性能。例如,在处理日志文件或解析配置文件时,使用std::string_view可以大幅提升性能。

(四)高效的搜索与匹配

std::string_view提供了丰富的成员函数,用于字符串的比较、查找等操作,这些操作在不复制原始数据的情况下进行,提高了效率。

三、使用注意事项

(一)生命周期管理

std::string_view不负责内存管理,使用时需要确保其引用的数据在string_view的生命周期内是有效的,否则可能导致悬空指针或野指针问题。

(二)安全性

虽然std::string_view提供了字符串的长度信息,避免了字符串越界问题,但在使用过程中仍需注意数据的有效性和安全性。

四、示例代码

以下示例代码展示了如何使用 std::string_view 以及它在不同场景下的性能优势:

#include <iostream>
#include <string>
#include <string_view>
#include <vector>
#include <chrono>// 示例1:从不同类型的字符串创建 string_view
void createStringView() {// 从 std::string 创建std::string str = "Hello, World!";std::string_view view1(str);std::cout << "view1: " << view1 << std::endl;// 从 C 风格字符串创建const char* cstr = "C-style string";std::string_view view2(cstr);std::cout << "view2: " << view2 << std::endl;// 从字符数组创建const char arr[] = "Character array";std::string_view view3(arr, sizeof(arr) - 1); // 注意:手动指定长度std::cout << "view3: " << view3 << std::endl;
}// 示例2:使用 string_view 的成员函数
void useStringViewFunctions() {std::string str = "Hello, World!";std::string_view view(str);// 基本操作std::cout << "Length: " << view.length() << std::endl;std::cout << "Substring: " << view.substr(7) << std::endl; // "World!"// 查找操作size_t pos = view.find(',');if (pos != std::string_view::npos) {std::cout << "Found comma at position: " << pos << std::endl;}
}// 示例3:性能测试 - 函数参数传递
void processString(const std::string& str) {// 模拟处理
}void processStringView(std::string_view view) {// 模拟处理
}void performanceTest() {std::string largeString(1000000, 'a'); // 创建一个较大的字符串// 测试 std::string 的性能auto start = std::chrono::high_resolution_clock::now();for (int i = 0; i < 1000; ++i) {processString(largeString);}auto end = std::chrono::high_resolution_clock::now();std::cout << "std::string time: " << std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() << " us" << std::endl;// 测试 std::string_view 的性能start = std::chrono::high_resolution_clock::now();for (int i = 0; i < 1000; ++i) {processStringView(largeString);}end = std::chrono::high_resolution_clock::now();std::cout << "std::string_view time: " << std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() << " us" << std::endl;
}// 示例4:性能测试 - 字符串处理
void parseLogLine(const std::string& line) {// 模拟解析日志行size_t pos = line.find(' ');if (pos != std::string::npos) {std::string timestamp = line.substr(0, pos);// ...}
}void parseLogLineView(std::string_view line) {// 模拟解析日志行size_t pos = line.find(' ');if (pos != std::string_view::npos) {std::string_view timestamp = line.substr(0, pos);// ...}
}void stringProcessingTest() {std::string logLine = "2023-10-01 12:34:56 INFO Some log message";// 测试 std::string 的性能auto start = std::chrono::high_resolution_clock::now();for (int i = 0; i < 1000000; ++i) {parseLogLine(logLine);}auto end = std::chrono::high_resolution_clock::now();std::cout << "std::string processing time: " << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << " ms" << std::endl;// 测试 std::string_view 的性能start = std::chrono::high_resolution_clock::now();for (int i = 0; i < 1000000; ++i) {parseLogLineView(logLine);}end = std::chrono::high_resolution_clock::now();std::cout << "std::string_view processing time: " << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << " ms" << std::endl;
}int main() {createStringView();useStringViewFunctions();performanceTest();stringProcessingTest();return 0;
}

代码说明

  1. 创建 std::string_view

    • 可以从 std::string、C 风格字符串或字符数组创建 std::string_view
    • 注意:从字符数组创建时,需要手动指定长度,否则可能会包含多余的字符。
  2. 使用 std::string_view 的成员函数

    • substr:获取子字符串视图(不涉及数据复制)。
    • find:查找字符或子字符串的位置。
  3. 性能测试 - 函数参数传递

    • 比较了 std::stringstd::string_view 作为函数参数时的性能差异。
    • std::string_view 避免了不必要的数据复制,性能更高。
  4. 性能测试 - 字符串处理

    • 模拟解析日志行的场景,比较了 std::stringstd::string_view 的性能。
    • std::string_view 在字符串处理场景中表现更优,因为它避免了创建临时字符串对象。

五、总结

std::string_view作为一种轻量级的字符串处理工具,在只读场景下,特别是在需要高性能的场景下,具有显著的优势。它通过避免不必要的字符串拷贝,提高了程序的性能,同时保持了API的灵活性。在现代C++编程中,合理运用std::string_view,可以在确保性能的同时,提高程序的安全性和灵活性。

http://www.dtcms.com/a/435101.html

相关文章:

  • 电影网站建设哪家便宜深圳市做网站公司
  • 实战破解前端渲染:当 Requests 无法获取数据时(Selenium/Playwright 入门)
  • 如何建立小企业网站论坛源码哪个好
  • 网站建设摊销时间是多久seo咨询服务
  • 精细化工企业安全运营:危化品投料记录与反应釜压力实时监控方案
  • 网站的ftp信息推广公司哪里找
  • 【精品资料鉴赏】384页WORD版小学智慧校园项目建设初步设计方案
  • 手机移动网站建设怎么把网站放到服务器
  • 《牛刀小试!C++ string类核心接口实战编程题集》
  • 做视频网站资源采集软件app定制开发
  • 【原创】SpringBoot3+Vue3商品信息管理系统
  • 3 阐述网站建设的步骤过程哪种网站开发简单
  • Spring Boot 热部署配置与自定义排除项
  • B007基于博途西门子1200PLC四节传送带控制系统仿真
  • C++11新特性解析与应用(1)
  • 【LangChain】P7 对话记忆完全指南:从原理到实战(下)
  • 上海建设房屋网站下载好了网站模板怎么开始做网站
  • 远程智能康养实训室:训练学生驾驭物联网,服务未来居家康养新时代
  • ⚡ WSL2 搭建 s5p6818 Linux 嵌入式开发平台(part 1):环境准备与架构设计
  • 学科建设网站wordpress 主体安装
  • 如何免费建立自己的网站中国建设摩托车
  • 主机服务器网站 怎么做孝义网站建设
  • 快速搭建企业网站阿里虚拟机建设网站
  • 山西建设机械网站首页备案添加网站
  • 店面建设网站的必要性58同城装修设计师
  • C语言笔记
  • 23ICPC合肥站补题
  • LR算法中反向最右推导(Reverse RightMost Derivation)
  • 企业网站托管服务常用指南wordpress ssl证书
  • 专注于响应式网站开发高端定制网站建设高端旅游定制