当一个函数采用shared_ptr
(来自boost或C++ 11 STL)时,你传递它:
通过const引用: void foo(const shared_ptr<T>& p)
或按价值:void foo(shared_ptr<T> p)
?
我更喜欢第一种方法,因为我怀疑它会更快.但这真的值得吗还是还有其他问题吗?
您能否说出您选择的原因或案例,为什么您认为无关紧要.
当智能指针涉及应用程序时,我一直在阅读有关性能问题的大量讨论.其中一个常见的建议是将智能指针作为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&节省了一些时间,因为没有涉及复制,也没有锁定来管理引用计数.但是价格让代码不那么安全了吧?
简短介绍:我正在研究多线程代码,我必须在两个线程之间共享动态分配的对象.为了使我的代码更清晰(并且更不容易出错),我希望在每个线程中明确地"删除"对象,这就是我想要使用的原因shared_ptr
.
第一个问题:
我想知道在运行时是否实现-> operator
in shared_ptr
有一些额外的开销(例如更大unique_ptr
).我正在谈论的对象通常是在创建之后仅复制一次的longlife实例(当我在线程之间分发它们时),然后我只访问这些对象的方法和字段.
我知道,shared_ptr
这只保护引用计数.
第二个问题:
shared_ptr
在libstdc ++中如何优化?它总是使用互斥量还是利用原子操作(我专注于x86和ARM平台)?
我正在研究一个多线程程序,但有一个UI组件,它广泛使用std :: shared_ptr来管理元素.我可以保证只有一个线程会使用这些shared_ptrs.
有没有办法定义一个不会导致线程安全引用计数开销的shared_ptr?
它可以基于boost :: shared_ptr或std :: shared_ptr.
编辑:感谢您提及intrusive_ptr的答案.我忽略了提到我还需要weak_ptr功能,以便将其排除在外.
更新:我的答案是使用Boost的local_shared_ptr.看看'他漫步'的评论
我需要处理一个文件列表.不应对同一文件重复处理操作.我用的代码是 -
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分钟 - …