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

C++ sso是否在std::string以外的任何其他标准库容器中使用?,c++,c++11,stl,c++14,C++,C++11,Stl,C++14,SSO(小/短字符串优化)可用于std::string。但它是否允许用于其他标准库容器(例如std::vector)?答案是否取决于容器的模板参数是内置类型还是用户定义类型?更广泛的术语是SBO-小缓冲区优化。SSO是特定于字符串的 无论如何,由于迭代器无效规则,标准库中的大多数其他容器都无法使用SBO。该标准保证容器中的迭代器在移动过程中保持有效。即: std::vector<T> v = ...; auto iter = v.begin(); // assume v is non

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

更广泛的术语是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
std::vector v=。。。;
自动iter=v.begin();//假设v是非空的
std::vector new_v=std::move(v);
foo(*iter);//*一定没事
SBO不可能满足这一保证,因为
iter
可能会指向
vs
的自动存储,而该存储无法神奇地转移到
新的\u v
<代码>标准::字符串没有这种保证,所以可以


另一方面,像
std::function
这样的东西可以(而且通常确实)实现SBO,因为没有这样的移动保证。从容器的意义上说,这不是一个真正的容器

你真的不能一般地这么做
std::string
知道它正在存储
char
,因此可以构建它来利用这一点。在类似向量的类型中,单个元素可能比它可能拥有的缓冲区大。
std::vector
实现不能使用小缓冲区优化,因为
swap
会使迭代器无效,这是标准所禁止的。哦,好的,明白了,感谢您提供的信息,@NathanOliver:)将类似SSO的东西与
vector
一起使用还有一个问题:如果(例如)复制或移动某个项目可能引发异常,则无法满足异常安全要求
string
只是说您不能在可能抛出的类型上实例化它,但
vector
不能这样做。如果我错了,请纠正我,但我认为
std::function
可以使用“SSO”(小函子优化?)来存储其可调用项。您知道在移动后iter如何保持有效吗?我的意思是,当你将所有元素从v移动到新位置(如果足够大,这里是new_v)时,由v保留在堆上的内存被删除,那么iter怎么可能知道它应该指向新位置?@bladzio“然后由
v
保留在堆上的内存被删除”它不会被删除。其所有权转移至
new\u v
new\u v
拥有的内存是已删除的内存。