相关疑难解决方法(0)

std :: forward_list和std :: forward_list :: push_back

我想使用std :: forward_list

因为:

转发列表是一个容器,支持从容器的任何位置快速插入和删除元素

但是没有*std :: forward_list :: push_back*实现.

是否有一种高性能的方法来增加对一个或没有理由的支持?

c++ std c++11 forward-list

17
推荐指数
4
解决办法
1万
查看次数

为什么VC++字符串不被引用计数?

STL标准不要求从std :: string中重新计算.但事实上,大多数C++实现都提供了refcounted,copy-on-write字符串,允许您将值作为基本类型传递.此外,这些实现(至少g ++)使用原子操作使这些字符串无锁和线程安全.

简单的测试显示了写时复制语义:

#include <iostream>
#include <string>

using namespace std;

void foo(string s)
{
    cout<<(void*)s.c_str()<<endl;
    string ss=s;
    cout<<(void*)ss.c_str()<<endl;
    char p=ss[0];
    cout<<(void*)ss.c_str()<<endl;
}

int main()
{
    string s="coocko";
    cout<<(void*)s.c_str()<<endl;
    foo(s);
    cout<<(void*)s.c_str()<<endl;
}
Run Code Online (Sandbox Code Playgroud)

在使用非常数成员后,只有两个地址完全打印.

我使用HP,GCC和Intel编译器测试了这段代码,得到了类似的结果 - 字符串可以作为写时复制容器.

另一方面,VC++ 2005清楚地表明每个字符串都是完全复制的.

为什么?

我知道VC++ 6.0中存在一个错误,它具有非线程安全的引用计数实现,导致随机程序崩溃.这是什么原因?他们只是害怕再使用ref-count,即使这是常见的做法?他们宁愿不使用重新计算来解决问题吗?

谢谢

c++ string reference-counting copy-on-write visual-c++

13
推荐指数
4
解决办法
5202
查看次数

C++ 0x性能改进

允许编写更高效的C++代码的C++ 0x改进之一是unique_ptr智能指针(太糟糕了,它不允许像memmove()那样移动:提案没有进入草案).

即将推出的标准中有哪些其他性能改进?以下代码为例:

vector<char *> v(10,"astring");
string concat = accumulate(v.begin(),v.end(), string(""));
Run Code Online (Sandbox Code Playgroud)

代码将连接vector v中包含的所有字符串.这段简洁代码的问题在于accumulate()复制周围的东西,并且不使用引用.并且每次调用string()时都会重新分配加上运算符.因此,与优化良好的模拟C代码相比,代码性能较差.

C++ 0x是否提供了解决问题的工具,也许还有其他工具?

c++ optimization stl unique-ptr c++11

9
推荐指数
2
解决办法
2020
查看次数