如何解决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";
}
虽然在 Windows 控制台应用程序中地址完全相同:
解决方法
主要有两种方法:
-
直接测试一下。
记住使用
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())); }
-
比较容量。
这依赖于合理的实现,这意味着当当前容量足够时永远不会动态分配。
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);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。