Visual Studio 2012中stl:string 不支持引用计数了吗,该怎么处理
Visual Studio 2012中stl:string 不支持引用计数了吗
使用Visual Studio 2012开发的程序中使用了 一个json解析工具:代码中存在很多这样的代码
sVal.push_back(c);
wstring strVal = sVal;
TrimString(strVal, 0);
发现字符串很长的时候将 wstring strVal = sVal;去掉改为执行TrimString(sVal, 0); 执行很快,以前看书上说这样写的
sVal 和strVal 共用一个字符串数据数组的。 VS2012的库中不是这样实现的了吗。
安装网上的代码写了个测试
void CMFCApplication16Dlg::OnBnClickedOk()
{
string s="dfddasaaaaaafdsasdgffasfasdfasaaaaaaaaaaaadfgdgdfaaassdfsfsdfs";
string s2=s;
unsigned int a1= (unsigned int)s.c_str() ;
unsigned int a2= (unsigned int)s2.c_str() ;
if(a1==a2)
{
AfxMessageBox(L".......");
}
// TODO: 在此添加控件通知处理程序代码
CDialogEx::OnOK();
}
没有对话框弹出,是需要配置Visual Studio,还是已经不支持共用字符串了,不支持的话只能减少 wstring strVal = sVal类似操作了。
------解决思路----------------------
STL的string并不要求reference counted. 似乎从VS2005开始就这样了。VC++ 6.0中倒是实现了非线程安全的reference counting(被视作bug)。而且c++98标准中就有了non-reference counting string。而且越来越多的编译器的std::string的实现去掉了reference counting特性(由于兼容性问题,可能通过另一个头文件实现了non-reference counting string),因为已经证明了string的reference count机制对多线程优化是个明显的阻碍。
使用Visual Studio 2012开发的程序中使用了 一个json解析工具:代码中存在很多这样的代码
sVal.push_back(c);
wstring strVal = sVal;
TrimString(strVal, 0);
发现字符串很长的时候将 wstring strVal = sVal;去掉改为执行TrimString(sVal, 0); 执行很快,以前看书上说这样写的
sVal 和strVal 共用一个字符串数据数组的。 VS2012的库中不是这样实现的了吗。
安装网上的代码写了个测试
void CMFCApplication16Dlg::OnBnClickedOk()
{
string s="dfddasaaaaaafdsasdgffasfasdfasaaaaaaaaaaaadfgdgdfaaassdfsfsdfs";
string s2=s;
unsigned int a1= (unsigned int)s.c_str() ;
unsigned int a2= (unsigned int)s2.c_str() ;
if(a1==a2)
{
AfxMessageBox(L".......");
}
// TODO: 在此添加控件通知处理程序代码
CDialogEx::OnOK();
}
没有对话框弹出,是需要配置Visual Studio,还是已经不支持共用字符串了,不支持的话只能减少 wstring strVal = sVal类似操作了。
------解决思路----------------------
STL的string并不要求reference counted. 似乎从VS2005开始就这样了。VC++ 6.0中倒是实现了非线程安全的reference counting(被视作bug)。而且c++98标准中就有了non-reference counting string。而且越来越多的编译器的std::string的实现去掉了reference counting特性(由于兼容性问题,可能通过另一个头文件实现了non-reference counting string),因为已经证明了string的reference count机制对多线程优化是个明显的阻碍。