Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;SSO:如何通过编程查找std::wstring是否分配了短字符串优化?_C++_String_C++11_Wstring - Fatal编程技术网

C++ C++;SSO:如何通过编程查找std::wstring是否分配了短字符串优化?

C++ C++;SSO:如何通过编程查找std::wstring是否分配了短字符串优化?,c++,string,c++11,wstring,C++,String,C++11,Wstring,如何通过编程查找std::wstring是否分配了短字符串优化?我试图检测这种情况,并使用reserve退出SSO 下面的代码打印地址中的一个小差异: #include <string> #include <iostream> int main () { std::wstring str = L"H"; std::cout<<&str<<" "<<(void*)str.d

如何通过编程查找
std::wstring
是否分配了
短字符串优化
?我试图检测这种情况,并使用
reserve
退出SSO

下面的代码打印地址中的一个小差异:

#include <string>
#include <iostream>
int main () 
{
    std::wstring str = L"H";
    std::cout<<&str<<" "<<(void*)str.data()<<"\n";
} 

尽管在windows控制台应用程序中,地址完全相同:


有两种主要方法:

  • 直接测试一下

    请记住使用以获取完整订单,并说明在怪异类中重载的
    op&

    template <class T>
    constexpr bool uses_sbo(T&& t) noexcept {
        auto less = std::less<void*>();
        return less(t.data(), std::addressof(t) + 1) && !less(std::addressof(t), t.data()));
    }
    
    
    模板
    constexpr bool使用_sbo(T&&T)noexcept{
    自动减少=标准::减少();
    返回less(t.data(),std::addressof(t)+1)和&!less(std::addressof(t),t.data());
    }
    
  • 比较容量

    这取决于实现是否合理,这意味着在当前容量足够时永远不会动态分配

    template <class T>
    constexpr bool is_minimal(T&& t) noexcept {
        return t.capacity() == T().capacity();
    }
    
    
    模板
    constexpr bool是最小的(T&&T)不例外{
    返回t.capacity()==t().capacity();
    }
    
  • 这两种方法都适用于所有连续容器。

    模板
    
    template<typename T>
    bool ssoTest1(const std::basic_string<T>& s)
    {
        return s.capacity() == std::basic_string<T>{}.capacity();
    }
    
    template<typename T>
    bool ssoTest2(const std::basic_string<T>& s)
    {
        uintptr_t r = s.data() - reinterpret_cast<const T*>(&s);
        return r <= sizeof(s);
    }
    
    布尔ssoTest1(常数标准::基本字符串和s) { 返回s.capacity()==std::basic_string{}.capacity(); } 样板 bool ssoTest2(常数标准::基本字符串和s) { uintptpr\u t r=s.data()-重新解释强制转换(&s);
    return r您试图解决什么问题?不,不是关于确定wstring是否使用SSO的问题,而是您认为解决方案需要未SSO化的wstring的问题?即使没有SSO,您也不能依靠
    std::wstring::data
    指向字符串对象的开始。
    struct string{size\u t len;size\u t容量;图表*数据;..}“NathanOliver /代码”将是一个有效的非SSO字符串,它会给您地址的不同。@您可以检查它是否指向范围“代码>和STR <代码>,<代码>和STR + 1 < /代码>为什么1 +为硬编码?@ SayangangHuSH:因为<代码>和STR < /C>是一个类型化指针。在C++ <代码> + 1 < /C>中,指针由一个对象递增,而不是一个字节。我不知道你为什么没有完全概括。
    
    template<typename T>
    bool ssoTest1(const std::basic_string<T>& s)
    {
        return s.capacity() == std::basic_string<T>{}.capacity();
    }
    
    template<typename T>
    bool ssoTest2(const std::basic_string<T>& s)
    {
        uintptr_t r = s.data() - reinterpret_cast<const T*>(&s);
        return r <= sizeof(s);
    }