我正在尝试使用智能指针,并尝试在我的项目中将一些 shared_ptr 与 unique_ptr 进行交换,看看我是否能获得一点性能改进。
我有以下代码片段:
// --- probably can be replaced with with std::copy ...
if (j != sentences.size()) {
// also gives me an error if I initialize vector with a size.
std::vector<unique_ptr<StemmedSentence> > newSentences(j);
int base = 0;
for (size_t i = 0; i < j; i++) {
newSentences[base++] = std::move(sentences[i]); // std::move ??
}
sentences = newSentences; // std::move, i guess not !?
}
我将一个指针向量复制到一个新向量中(在本例中为 unique_ptr 的向量)。使用shared_ptr,这完全没有问题。据我了解,共享指针使用隐式赋值,一切正常。但是,使用 unique_ptr 时,我需要重载赋值运算符(以转移所有权),这让我很头疼。
我创建了这个作业:
ArrayStemmedSnippet& operator=(const ArrayStemmedSnippet& other) {
if (this != &other) {
sentences.clear();
std::vector<unique_ptr<StemmedSentence> >::const_iterator it;
for (it = other.sentences.begin(); it != other.sentences.end(); ++it) {
sentences.push_back(std::unique_ptr< StemmedSentence >(*it ?
*it : std::unique_ptr< StemmedSentence >())); // --- compiler error
}
return (*this);
}
}
复制的指针可以包含“Null”指针。我尝试在 for 循环中检查它并复制指针或空的 unique_ptr 实例(nullptr)。标有编译器错误的那一行给了我一个问题,我无法弄清楚正确的语法。另外我认为如果我复制一个非空对象,我必须创建一个新指针(克隆)。有人可以给我一个提示吗?
我发现了一个类似的帖子Handling smart pointers in stl container,Howard Hinnant 的回答给了我尝试的灵感。但我不能使用那种语法,我的测试机上有 gcc 版本 4.4.3。
我不知道我是否会获得更多的性能,就像我说的,我做实验。据我所知,我的代码中没有所有权问题,所以我认为使用 unique_ptr 进行测试并跳过 shared_ptr(及其所有开销)可能会在性能上有所提高。我有大约 5 个使用 shared_ptr 的对象,所以我会试一试。
如果这一切都没有意义,请告诉我是否值得与 uniqe_ptr 一起玩。
提前致谢!