gpt4 book ai didi

C++ 智能指针 : sharing pointers vs. 共享数据

转载 作者:可可西里 更新时间:2023-11-01 16:36:37 30 4
gpt4 key购买 nike

在此insightful article ,其中一位 Qt 程序员试图解释 Qt 实现的不同种类的智能指针。一开始,他区分了共享数据和共享指针本身:

First, let’s get one thing straight: there’s a difference between sharing pointers and sharing data. When you share pointers, the value of the pointer and its lifetime is protected by the smart pointer class. In other words, the pointer is the invariant. However, the object that the pointer is pointing to is completely outside its control. We don’t know if the object is copiable or not, if it’s assignable or not.

Now, sharing of data involves the smart pointer class knowing something about the data being shared. In fact, the whole point is that the data is being shared and we don’t care how. The fact that pointers are being used to share the data is irrelevant at this point. For example, you don’t really care how Qt tool classes are implicitly shared, do you? What matters to you is that they are shared (thus reducing memory consumption) and that they work as if they weren’t.

坦率地说,我只是不理解这个解释。文章评论中有澄清请求,但我认为作者的解释不够。

如果您确实理解这一点,请解释。这种区别是什么,其他共享指针类(即来自 boost 或新的 C++ 标准)如何适应这种分类法?

提前致谢

最佳答案

在后来的评论中,他澄清了一点

This is the important point I tried to get through in the first section. When you use QSharedPointer, you’re sharing the ownership of the pointer. The class controls and handles the pointer only — anything else (like access to the data) is outside its scope. When you use QSharedDataPointer, you’re sharing the data. And that class is intended for implicit sharing: so it may split up.

试图解释:

需要注意的是,这里的“指针”并不是指存储地址的对象,而是指对象所在的存储位置(地址本身)。所以严格来说,我认为,你必须说你正在分享地址。 boost::shared_ptr因此是共享“指针”的智能指针。 boost::intrusive_ptr或另一个侵入式智能指针似乎也共享该指针,尽管对所指向的对象有所了解(它具有引用计数成员或递增/递减它的函数)。

例子:如果有人和你分享一个黑盒子,而他不知道黑盒子里面是什么,这类似于分享指针(代表盒子),而不是数据(盒子里面是什么) ).事实上,你甚至不知道盒子里面的东西是可以共享的(如果盒子里什么都没有怎么办?)。智能指针由您和其他人代表(当然,您不共享),但地址是盒子,是共享的。

共享数据意味着智能指针充分了解指向的数据,它可能会更改指向的地址(这需要复制数据等)。因此,指针现在可能指向不同的地址。由于地址不同,地址不再共享。这就是std::string也在一些实现上做:

std::string a("foo"), b(a);
// a and b may point to the same storage by now.
std::cout << (void*)a.c_str(), (void*)b.c_str();
// but now, since you could modify data, they will
// be different
std::cout << (void*)&a[0], (void*)&b[0];

共享数据并不一定意味着您有指针呈现给您。您可以使用 std::string通过纯粹的方式 a[0]cout << a;永远不要触摸任何 c_str()功能。仍然可以在幕后进行共享。许多 Qt 类和其他小部件工具包的类也会发生同样的事情,这称为隐式共享(或写时复制)。所以我认为可以这样总结:

  • 共享指针:当我们复制一个智能指针时,我们总是指向同一个地址,这意味着我们共享指针值。
  • 共享数据:我们可能会在不同的时间指向不同的地址。这意味着我们知道如何将数据从一个地址复制到另一个地址。

所以尝试归类

  • boost::shared_ptr , boost::intrusive_ptr :共享指针,而不是数据。
  • QString , QPen , QSharedDataPointer :共享其中包含的数据。
  • std::unique_ptr , std::auto_ptr (还有 QScopedPointer ):既不共享指针,也不共享数据。

关于C++ 智能指针 : sharing pointers vs. 共享数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2657762/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com