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);
}