c++ 当你使用string时进行代码优化

c++17提供了新特性 std::string_view ,可以用来代替 std::string , 它的工作原理类似于指针,如果使用std::string,会导致多余的new 分配内存,很多时候是没有必要的,因此我们尽量使用指针,或者c++17的新特性,std::string_view,代码分析如下:

#include 
#include   

static uint32_t s_AllocCount = 0;
/*重载new,可以让我们看到使用了多少次new操作来分配内存*/
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;
}

/*我的电脑在debug模式下默认有三个分配,在release模式下0个*/
int main() { 
	/*优化,没必要使用std::string,建议使用const char* */
	std::string name = "Yan Chernikov";
	// const char* name = "Yan Chernikov";

	PrintName(name);

	std::string firstName = name.substr(0, 3);
	std::string lastName = name.substr(4, 9);
	PrintName(name.substr(0, 3));

	/*c++ 17  优化,使用string_view 代替 string */
	//std::string_view firstName(name.c_str(), 3);
	//std::string_view lastName(name.c_str() + 4, 9);

	std::cout << s_AllocCount << " allocations" << std::endl;
	
	std::cin.get();
}

使用指针来实现这段std::string_view的代码可以这样写:

// 获取字符串的指针
const char* str = name.c_str();

// firstName指向从开始位置指针3个字符
const char* firstName = str;

// lastName指向从位置str+4开始的9个字符
const char* lastName = str + 4;

// 打印
std::cout << std::string(firstName, 3) << std::endl;
std::cout << std::string(lastName, 9) << std::endl;

主要过程:

  1. 使用name.c_str()获取字符串的const char*指针

  2. firstName直接赋值str,指向第一个字符

  3. lastName指针值加上偏移4,指向字符串第5个字符开始的位置

  4. 使用std::string构造函数,从指针位置构造指定长度的子字符串

  5. 打印输出结果

使用指针可以很直观地获取字符串的某个片段,通过指针移动和修正来指定位置和长度。

与std::string_view语法类似,但采用的是低级指针操作取代高阶抽象。

你可能感兴趣的:(总结记录c++,c++,开发语言)