前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何让C++字符串更快

如何让C++字符串更快

作者头像
BrianLee
发布2023-02-12 17:29:34
6870
发布2023-02-12 17:29:34
举报
文章被收录于专栏:用户1031264的专栏

1、上代码,原有写法

代码语言:c++
复制
#include <iostream>
#include <string>


static uint32_t s_AllocCount = 0;

void* operator new(size_t size) 
{
	s_AllocCount++;
	std::cout << "Allocating " << size << " bytes\n";
	return malloc(size);
}

void PrintName(const std::string& name) 
{

	std::cout << name << std::endl;
}


int main() 
{
	std::string name = "Yan Chernikov";
	PrintName(name);
	std::string firstName = name.substr(0, 3);
	std::string lastName = name.substr(4, 9);
	

	std::cout << s_AllocCount << " allocations" << std::endl;

	std::cin.get();
}

1.1、运行结果

分配了三次内存
分配了三次内存

std::string name ="Yan Chernikov";

PrintName(name);

std::string firstName = name.substr(0,3);

std::string lastName = name.substr(4,9);

2、第一次优化

2.1、代码

代码语言:c++
复制
#include <iostream>
#include <string>


static uint32_t s_AllocCount = 0;

void* operator new(size_t size)
{
	s_AllocCount++;
	std::cout << "Allocating " << size << " bytes\n";
	return malloc(size);
}

void PrintName(std::string_view name)
{

	std::cout << name << std::endl;
}


int main()
{
	std::string name = "Yan Chernikov";

#if 0
	std::string firstName = name.substr(0, 3);
	std::string lastName = name.substr(4, 9);
#else
	std::string_view firstName(name.c_str(), 3);
	std::string_view lastName(name.c_str() + 4, 9);
#endif

	PrintName(firstName);
	PrintName(lastName);
	std::cout << s_AllocCount << " allocations" << std::endl;

	std::cin.get();
}

2.2 运行结果

image.png
image.png

2.3、用string_view 替换string

3、第二次优化

3.1、代码

代码语言:c++
复制
#include <iostream>
#include <string>


static uint32_t s_AllocCount = 0;

void* operator new(size_t size)
{
	s_AllocCount++;
	std::cout << "Allocating " << size << " bytes\n";
	return malloc(size);
}

void PrintName(std::string_view name)
{

	std::cout << name << std::endl;
}


int main()
{
	const char* name = "Yan Chernikov";

#if 0
	std::string firstName = name.substr(0, 3);
	std::string lastName = name.substr(4, 9);
#else
	std::string_view firstName(name, 3);
	std::string_view lastName(name + 4, 9);
#endif

	PrintName("firstName");
	PrintName("lastName");
	std::cout << s_AllocCount << " allocations" << std::endl;

	std::cin.get();
}

3.2、运行结果

image.png
image.png

3.3、修改的代码

代码语言:txt
复制
const char* name = "Yan Chernikov";
代码语言:txt
复制
std::string_view firstName(name, 3);
代码语言:txt
复制
std::string_view lastName(name + 4, 9);
代码语言:txt
复制
PrintName("firstName");
代码语言:txt
复制
PrintName("lastName");

4、第二次修改(const char* name = "Yan Chernikov";)在只能使用string且数据量较大的情况下,是不方便的。

我们要做的是修改PrintName函数中的参数为PrintName(std::string_view nam),分配次数就可以从1变成0了。

4.1、代码

代码语言:c++
复制
#include <iostream>
#include <string>


static uint32_t s_AllocCount = 0;

void* operator new(size_t size)
{
	s_AllocCount++;
	std::cout << "Allocating " << size << " bytes\n";
	return malloc(size);
}

void PrintName(std::string_view name)
{

	std::cout << name << std::endl;
}


int main()
{
	const char* name = "Yan Chernikov";

#if 0
	std::string firstName = name.substr(0, 3);
	std::string lastName = name.substr(4, 9);
#else
	std::string_view firstName(name, 3);
	std::string_view lastName(name + 4, 9);
#endif
	PrintName(name);
	/*PrintName("firstName");
	PrintName("lastName");*/
	std::cout << s_AllocCount << " allocations" << std::endl;

	std::cin.get();
}

4.2、运行结果:

image.png
image.png

5、总结

像这种在C++中,尤其是多个循环中,使用string是非常影响性能的,如果可以使用string_view,则可以有效提示效率,加快运行速度。

本文系外文翻译,前往查看

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

本文系外文翻译前往查看

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、上代码,原有写法
    • 1.1、运行结果
      • std::string name ="Yan Chernikov";
      • 2、第一次优化
        • 2.1、代码
          • 2.2 运行结果
            • 2.3、用string_view 替换string
            • 3、第二次优化
              • 3.1、代码
                • 3.2、运行结果
                  • 3.3、修改的代码
                  • 4、第二次修改(const char* name = "Yan Chernikov";)在只能使用string且数据量较大的情况下,是不方便的。
                    • 4.1、代码
                      • 4.2、运行结果:
                      • 5、总结
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档