- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
动机
假设有一个很大的类A
,我想把它存储在一个 vector 中,我也希望这个 vector 是可复制的。因此,像 std::shared_ptr
这样的智能指针和 std::unique_ptr
不会是好的选择。我知道我可以存储 A
的对象在std::vector<A>
直接地。但正如我所说,A
是一个非常大的类。由于 std::vector<A>
的元素连续驻留在内存中,很有可能std::vector<A>
如果我经常更新它需要重新分配内存。所以,我需要一个“智能指针”(比如说 copyable_ptr
),它将在复制智能指针本身时复制底层资源。然后我可以使用 std::vector<copyable_ptr<A>>
管理 A
的对象.
这是copyable_ptr
的片段模板类:
template <typename T> class copyable_ptr {
public:
explicit copyable_ptr(T *p) : p(p) {}
copyable_ptr(copyable_ptr const &rhs) : p(new T(*rhs.p)) {}
copyable_ptr(copyable_ptr &&rhs) : p(rhs.p) { rhs.p = nullptr; }
~copyable_ptr() { delete p; }
copyable_ptr &operator=(copyable_ptr rhs) {
swap(rhs);
return *this;
}
void swap(copyable_ptr &rhs) {
using std::swap;
swap(p, rhs.p);
}
T &operator*() const { return *p; }
T *operator->() const { return &this->operator*(); }
/* other members */
private:
T *p;
};
template <typename T>
inline void swap(copyable_ptr<T> &lhs, copyable_ptr<T> &rhs) {
lhs.swap(rhs);
}
问题
是否有我可以直接使用的类似类,或者我应该编写自己的类,还是有任何其他合适的解决方案来将大类存储在容器中?
编辑
我想我应该更清楚地解释一下自己。 A
是一个很大的类(class),我想用 std::vector
管理 A
的对象.基本上,有四种选择可以完成这项工作:
std::vector<std::shared_ptr<A>> a1; // #1
std::vector<std::unique_ptr<A>> a2; // #2
std::vector<A *> a3; // #3
std::vector<A> a4; // #4
我不想共享 A
的对象,这使得#1 不合适。 vector 在#2 中不可复制,我必须手动处理内存管理在#3。所以,只剩下#4了。
但是,我不喜欢#4 的地方是 a4
的大小。达到其容量,重新分配发生。 a4
的两倍大小将被保留(正如我所说,A
是一个非常大的类,在堆中保留这么多连续内存只是为了潜在的使用是不是不合适?)。更糟糕的是,我们可能需要移动 a4
的每一个元素。从旧内存位置到新分配的内存。当我问这个问题时,我忘记提及的 #4 的另一个倒退是它不是多态支持。
所以,如果我使用 std::vector<copyable_ptr<A>>
管理 A
的对象,我上面提到的所有问题似乎都得到了妥善处理。您所需要的只是一个精心设计的 copyable_ptr
类,这就是我要找的。
最佳答案
是的,有这样一种东西:它叫做类本身。
智能指针的全部目的是为对象提供引用计数句柄,可以传递,无需复制底层对象,并在引用计数下降到 0 时自动销毁对象,并且引用对象的最后一个智能指针超出范围,它被销毁(shared_ptr
、unique_ptr
等之间引用计数语义的某些变体)。
如果你想要某种指向复制它的对象的指针,那么在复制指针时,你不需要指针。只需按值直接使用该对象。根据定义,每次复制它时,都保证复制该对象。
拥有某种指针,绝对不会增加任何值(value)。你想直接使用这个对象,需要的时候复制它,等等......就用这个对象。
关于c++ - 寻找一个智能指针,它会在复制智能指针本身时复制底层资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38690406/
有人告诉我,如果我只有一个“东西”,比如家(不是多个家),我应该在 routes.rb 中使用资源 :home,而不是资源 :home。但是当我查看路由时,POST 函数似乎想要 home#creat
Activity 开始。这些代码框架顺利通过。 // Initialize array adapters. One for already paired devices and //
资源 search-hadoop.com search-hadoop.com索引所有邮件列表,非常适合历史搜索。当你遇到问题时首先在这里搜索,因为很可能有人已经遇到了你的问题。 邮件列表 在A
我是 WPF 的新手,正在努力使用位于单独程序集中的样式。这就是我正在做的:- 我有一个带有\Themes 文件夹的类库项目,其中包含一个“generic.xaml”,它合并了\Themes 内的子文
我正在编写一个使用虚拟树状文件结构的插件。基本上它就像一个包含文件的标准文件系统,区别在于这些文件实际上并不存在于文件系统中的特定位置,而只是 java 对象。 这些当前由使用 SettingProv
如果我在 XAML 中使用以下内容,我会收到错误消息: 错
我正在使用 laravel 资源来获取 api 的数据: return [ 'id' => $this->id, 'unread' =>
我有以下 pom.xml: 4.0.0 mycompany resource-fail 0.0.1-SNAPSHOT BazBat
许多GDI +类都实现IDisposable,但是我不确定何时应该调用Dispose。对于使用new或静态方法(例如Graphics.CreateGraphics)创建的实例来说,这很明显。但是,由属
我正在构建一组 RESTful 资源,其工作方式如下:(我将使用“people”作为示例): 获取/people/{key} - 返回一个人对象 (JSON) GET/people?first_nam
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一个使用 $resource 的简单 Controller : var Regions = $resource('mocks/regions.json'); $scope.regions =
在 Azure 门户中,如何查看不同资源之间的依赖关系。我特别想查看哪些资源正在使用我要删除的存储。 最佳答案 您可以使用应用程序洞察应用程序 map 来执行此操作: 您还可以打开存储帐户的日志记录:
我正在使用 ionic 生成资源(图标和启动画面)。我正在使用 ionic v2.1.0 和 cordova v6.4.0。 到目前为止我一直在使用(它在以前的版本中工作): cordova plat
是否可以使用 Assets 包含子文件夹中的文件? 示例:[base_url]/assets/css/pepper-grinder/jquery-ui-1.8.11.custom.min.css 最佳
我正在阅读一些尝试教授 Android 开发的书。在书中,作者概述了 res/下的一些目录。他提到 res/menu 包含基于 XML 的菜单规范。他还提到了保存“通用文件”的 res/raw。当我创
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 9 年前。 Improv
我在服务器上使用 express-resource。在我的 AngularJS Controller 中: var User = $resource('/services/users/:use
因此,每当我运行我的应用程序时,它都会立即崩溃并给出以下错误: No package identifier when getting value for resource number 0x00000
对于我正在创建的(网络)应用程序,我需要使用基本身份验证在我的 UIWebView 中加载页面。 现在设置我使用的授权 header : NSString *result = [NSString st
我是一名优秀的程序员,十分优秀!