【C++】如何让C++字符串更快、C++的小字符串优化

二十三、如何让C++字符串更快、C++的小字符串优化

1、如何让C++字符串更快?
如果程序中有很多字符串操作,比如格式化文本(日志记录),那是非常糟糕的,因为字符串操作是很慢的。字符串string和它相关的很多函数很可能会自动分配内存:



说明:重载new操作符,返回malloc(size),这是基本的内存分配。
从上面例子中可以看出只要构造string字符串,就会自动进行内存分配;string操作也会动态分配内存。而这都会降低程序速度。

解决方案1:std::string_view
std::string_view是C++17中的一个新类,它的本质是指向现有内存的指针,或者说就是一个const char指针,指向别人拥有的字符串,再加上一个大小size。也就是我创建了一个窗口,一个进入现有内存的小视图,而不是分配一个新的字符串。在C++17之前,人们就是这样做的,不是去创建一个自己的字符串,而是观察一个已有的字符串。这样就没有内存分配,按值传递字符串视图是非常轻量级的,因为它只有一个指针和一个大小。下面我们重写一下substr和func函数:

解决方案2:完全不使用std::string
因为上面例子中的字符串是一个静态字符串,没有理由非得用std::string啊,用原始的const char*也很香啊:

解决方案3:最终代码
上面的优化是基于静态字符串的,如果这些字符串数据不仅仅是C++代码的静态类型,比如可能来自一个文件或以某种方式生成的,在这种情况下,我们还是得使用std::string字符串的,所以我们一般会写func函数的两个版本,一个不使用std::string_view版本,一个使用视图:

很多情况下,代码慢的大部分原因就是字符串操作造成的,我们要尽量避免字符串毫无意义的复制。

2、C++的小字符串优化

减少字符串在代码中的使用可以显著提高速度。但是我们都会不可避免的必须要用到字符串,那C++标准库如何优化小字符串?这是本小标题讨论的话题。

小字符串就是不是很长的字符串。小字符串优化又称sso。
小字符串的长度具体是多少,这要看你所使用的C++标准库,VS2022的长度是15个字符:

小字符串C++可以只分配一小块基于栈的缓冲区而不是堆分配。就是我们的静态字符串存储,其实是存储在一个静态分配的缓冲区,不会触及到堆内存。但前提是在realse模式下。
就是release模式下,如果你有一个不超过15个字符的字符串,它不会在堆上分配内存,只在栈缓冲区分配内存。如果你有一个16个字符或者以上的字符串,那就会调用heap malloc或者heap alloc,不管调用哪个,最终都是调用new操作符,导致堆分配:

所以,在C++标准库的实现中,任何小于16个字符的字符串都不会进行堆分配。这也是C++标准库字符串优化的一个小技巧吧,会使你的程序运行得更快。​

猜你喜欢

转载自blog.csdn.net/friday1203/article/details/143473331