C++SSO:如何以编程方式查找是否使用短字符串优化分配了std::wstring?
如何以编程方式查找 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";
}
输出示例:
0x7ffc39465220 0x7ffc39465230
尽管在 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())); } -
比较容量。
这依赖于合理的实现,这意味着当当前容量足够时永远不会动态分配。
template <class T> constexpr bool is_minimal(T&& t) noexcept { return t.capacity() == T().capacity(); }
两者都适用于所有连续的容器。
THE END
二维码