是否在std :: string以外的任何其他标准库容器中使用?

sur*_*h m 3 c++ stl c++11 c++14

可以使用SSO(小/短字符串优化)std::string.但它是否允许用于其他标准库容器(例如std::vector)?答案取决于容器的模板参数是内置类型还是用户定义类型?

Bar*_*rry 9

更广泛的术语是SBO - 小缓冲区优化.SSO是字符串特定的.

无论如何,由于迭代器失效规则,标准库中的大多数其他容器都无法使用SBO.该标准保证进入容器的迭代器通过移动保持有效.那是:

std::vector<T> v = ...;
auto iter = v.begin(); // assume v is non-empty
std::vector<T> new_v = std::move(v);
foo(*iter); // *must* be okay
Run Code Online (Sandbox Code Playgroud)

这种保证是不可能与SBO相遇的 - 因为它iter可能指向自动存储vs,不能神奇地转移到new_v.std::string没有这种保证,所以没关系.

另一方面,类似std::function<> 罐头(通常也会)实施SBO,因为没有这样的移动保证.这不是容器意义上的容器.