Boost C++ 库

...该项目是全球最受推崇、设计最精妙的 C++ 库之一。 Herb SutterAndrei Alexandrescu, C++ Coding Standards

Boost.StaticString - Boost C++ 函数库
Next

Boost.StaticString

Krystian Stasiowski

Vinnie Falco

根据 Boost 软件许可证版本 1.0 发布。(参见随附文件 LICENSE_1_0.txt 或在 https://boost.ac.cn/LICENSE_1_0.txt 复制)

简介

本库提供一种动态可变大小的字符串,其容量在编译时固定,且字符存储在字符串对象本身内部。其 API 与 std::string 非常相似。

动机

固定容量字符串在以下情况很有用:

  • 无法进行内存分配,例如,在没有自由存储的嵌入式环境中,只有堆栈和静态内存段可用。
  • 内存分配会带来不可接受的性能损失,例如,在延迟方面。
  • 需要在静态内存段中分配具有复杂生命周期的对象。
  • 需要在 constexpr 函数中进行动态可变大小的字符串。
  • 要求 static_vector 元素的存储位置位于字符串对象本身内部(例如,为了支持 memcpy 进行序列化)。

要求

本库有两种不同的使用模式:独立模式和依赖 Boost 模式。本库默认使用依赖 Boost 模式;通过使用配置宏 opt-in 即可启用独立模式。

在依赖 Boost 模式下,除了 Boost.Core、Boost.Utility 和 Boost.ContainerHash 外,本库还需要 C++11 或更高版本。在独立模式下,需要 C++17,但除了标准库外,不需要任何其他库。

设计

首要的设计目标是尽可能地模仿 std::string 的接口和行为。当任何操作超出字符串的最大允许大小时,如果启用了异常,则会抛出 std::length_error。所有抛出异常的算法都提供强大的异常安全保证。这旨在成为 std::string 的即插即用替换。

static_string 的 API 在少数地方与 std::string 有所不同,其中之一是增加了 subview 函数,该函数返回字符串视图而不是 static_string;并且某些永远不会抛出异常的函数被标记为 noexcept,这与 std::string 的函数不同。可用的 static_string 重载与 std::string 的重载相同。

迭代器

迭代器失效规则与 std::string 的不同。

  • 移动 static_string 会使所有迭代器失效。
  • 交换两个 static_string 会使所有迭代器失效。

优化

根据 static_string 的特化的字符类型和大小,会使用某些优化来减小类类型的大小。给定一个形式为 basic_static_string<N, CharT, Traits> 的特化名称

  • 如果 N 为 0,则类没有非静态数据成员。给定两个类型分别为 basic_static_string<0, T, Traits> 和 static_string<0, U, Traits> 的对象 a 和 b,如果 T 和 U 相同,则 data() 返回的指针值将相同。
  • 否则,用于存储 static_string 大小的成员的类型将是能够表示值 N 的最小标准无符号整数类型。

配置

可以通过定义配置宏来启用和禁用某些功能。宏及其控制的关联功能如下:

  • BOOST_STATIC_STRING_STANDALONE:当定义此宏时,本库将进入独立模式。

致谢

感谢 Agustín Bergé、Peter Dimov、Glen Fernandes 和 Christian Mazakas 在本库开发过程中提供的持续反馈和指导。

本库的开发由 The C++ Alliance 赞助。

参考

定义在 boost::static_strings 命名空间中。

basic_static_string


Next