Say*_*osh 2 c++ string wstring c++11
如何以编程方式查找 astd::wstring是否已分配Short String Optimization?我试图检测此类情况并用于reserve移出 SSO。
下面的代码在地址上打印了一个小的差异:
#include <string>
#include <iostream>
int main ()
{
std::wstring str = L"H";
std::cout<<&str<<" "<<(void*)str.data()<<"\n";
}
Run Code Online (Sandbox Code Playgroud)
输出示例:
0x7ffc39465220 0x7ffc39465230
Run Code Online (Sandbox Code Playgroud)
尽管在 Windows 控制台应用程序中,地址完全相同:
主要有两种方法:
直接测试一下就行了。
请记住使用std::less获取完整订单,并std::addressof考虑op&到奇怪类中的重载。
template <class T>
constexpr bool uses_sbo(T&& t) noexcept {
auto less = std::less<const volatile void*>();
auto p = std::addressof(t);
return less(t.data(), p + 1) && !less(p, t.data()));
}
Run Code Online (Sandbox Code Playgroud)
比较容量。
这依赖于合理的实现,这意味着当当前容量足够时永远不会动态分配。
template <class T>
constexpr bool is_minimal(T&& t) noexcept {
return t.capacity() == T().capacity();
}
Run Code Online (Sandbox Code Playgroud)
两者都适用于所有连续的容器。