SSO(小/短字符串优化)可用于std::string
。但它是否允许在其他标准库容器中使用(例如std::vector
)?答案取决于容器的模板参数是内置类型还是用户定义类型?
答案 0 :(得分: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
此保证无法与SBO见面 - 因为iter
可能指向vs
的自动存储,而new_v
无法神奇地转移到std::string
。 std::function<>
没有这种保证,所以没关系。
另一方面,像$ awk 'BEGIN{FS=OFS=","}($1 in a) && a[$1]!=$2{print $1,a[$1],$2}{a[$1]=$2}' file1 file2
2,mango,man
44,orange,oran
这样的东西(通常会)实现SBO,因为没有这样的移动保证。这不是容器意义上的容器。