相关疑难解决方法(0)

我们应该通过引用还是通过值传递shared_ptr?

当一个函数采用shared_ptr(来自boost或C++ 11 STL)时,你传递它:

  • 通过const引用: void foo(const shared_ptr<T>& p)

  • 或按价值:void foo(shared_ptr<T> p)

我更喜欢第一种方法,因为我怀疑它会更快.但这真的值得吗还是还有其他问题吗?

您能否说出您选择的原因或案例,为什么您认为无关紧要.

c++ boost shared-ptr c++11

253
推荐指数
8
解决办法
10万
查看次数

传递const shared_ptr <T>&而不仅仅是shared_ptr <T>作为参数

当智能指针涉及应用程序时,我一直在阅读有关性能问题的大量讨论.其中一个常见的建议是将智能指针作为const而不是副本传递,如下所示:

void doSomething(std::shared_ptr<T> o) {}
Run Code Online (Sandbox Code Playgroud)

void doSomething(const std::shared_ptr<T> &o) {}
Run Code Online (Sandbox Code Playgroud)

但是,第二种变体实际上是否会破坏共享指针的目的?我们实际上在这里共享共享指针,因此如果由于某些原因在调用代码中释放指针(想到重入或副作用),则const指针变为无效.共享指针实际应该阻止的情况.我理解const&节省了一些时间,因为没有涉及复制,也没有锁定来管理引用计数.但是价格让代码不那么安全了吧?

c++ shared-ptr

24
推荐指数
4
解决办法
7794
查看次数

使用shared_ptr的开销和实现

简短介绍:我正在研究多线程代码,我必须在两个线程之间共享动态分配的对象.为了使我的代码更清晰(并且更不容易出错),我希望在每个线程中明确地"删除"对象,这就是我想要使用的原因shared_ptr.

第一个问题:

我想知道在运行时是否实现-> operatorin shared_ptr有一些额外的开销(例如更大unique_ptr).我正在谈论的对象通常是在创建之后仅复制一次的longlife实例(当我在线程之间分发它们时),然后我只访问这些对象的方法和字段.

我知道,shared_ptr这只保护引用计数.

第二个问题:

shared_ptr在libstdc ++中如何优化?它总是使用互斥量还是利用原子操作(我专注于x86和ARM平台)?

c++ shared-ptr c++11

13
推荐指数
2
解决办法
5666
查看次数

创建非线程安全的shared_ptr

我正在研究一个多线程程序,但有一个UI组件,它广泛使用std :: shared_ptr来管理元素.我可以保证只有一个线程会使用这些shared_ptrs.

有没有办法定义一个不会导致线程安全引用计数开销的shared_ptr?

它可以基于boost :: shared_ptr或std :: shared_ptr.

编辑:感谢您提及intrusive_ptr的答案.我忽略了提到我还需要weak_ptr功能,以便将其排除在外.

更新:我的答案是使用Boost的local_shared_ptr.看看'他漫步'的评论

c++ boost stl

11
推荐指数
2
解决办法
2971
查看次数

C++地图性能 - Linux(30秒)vs Windows(30分钟)!

我需要处理一个文件列表.不应对同一文件重复处理操作.我用的代码是 -

using namespace std;

vector<File*> gInputFileList; //Can contain duplicates, File has member sFilename
map<string, File*> gProcessedFileList; //Using map to avoid linear search costs

void processFile(File* pFile)
{
    File* pProcessedFile = gProcessedFileList[pFile->sFilename];
    if(pProcessedFile != NULL)
        return; //Already processed

    foo(pFile); //foo() is the action to do for each file
    gProcessedFileList[pFile->sFilename] = pFile;
}

void main()
{
    size_t n= gInputFileList.size(); //Using array syntax (iterator syntax also gives identical performance)
    for(size_t i=0; i<n; i++){
        processFile(gInputFileList[i]);
    }
}
Run Code Online (Sandbox Code Playgroud)

代码工作正常,但......

我的问题是,当输入大小为1000时,在Windows/Visual Studio 2008 Express上需要30分钟 - …

c++ performance stl

6
推荐指数
1
解决办法
2029
查看次数

标签 统计

c++ ×5

shared-ptr ×3

boost ×2

c++11 ×2

stl ×2

performance ×1