微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++ SSO:如何以编程方式查找是否使用短字符串优化分配了 std::wstring?

如何解决C++ SSO:如何以编程方式查找是否使用短字符串优化分配了 std::wstring?

如何以编程方式查找 @ViewChild('resulttree') resulttree: ElementRef; updateResulttree(id: number) { for (let node of this.resultNodes) { node.children[0].children = node.children[0].children.filter(childnode => childnode.selected); node.children[1].children = node.children[1].children.filter(childnode => childnode.selected); } this.resulttree.treeModel.update(); setTimeout(() => { const someNode = this.resulttree.treeModel.getNodeBy(node => node.data.tree_node_id === id); someNode.setActiveAndVisible(); },100); } 是否分配有 std::wstring?我试图检测此类情况并使用 Short String Optimization 移出 SSO。

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

reserve

输出示例:

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

enter image description here

虽然在 Windows 控制台应用程序中地址完全相同:

enter image description here

解决方法

主要有两种方法:

  1. 直接测试一下。

    记住使用 std::less 来获取完整订单,并使用 std::addressof 来解决奇怪类中超载的 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()));
    }
    
    
  2. 比较容量。

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

    template <class T>
    constexpr bool is_minimal(T&& t) noexcept {
        return 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);
}

https://godbolt.org/z/v3b57Y

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。