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 控制台应用程序中,地址完全相同:

回答

主要有两种方法:

  1. 直接测试一下就行了。

    请记住使用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()));
    }
    
    
  2. 比较容量。

    这依赖于合理的实现,这意味着当当前容量足够时永远不会动态分配。

    template <class T>
    constexpr bool is_minimal(T&& t) noexcept {
        return t.capacity() == T().capacity();
    }
    
    

两者都适用于所有连续的容器。


以上是C++SSO:如何以编程方式查找是否使用短字符串优化分配了std::wstring?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>