加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 移动语义,标准集合和构造时间地址

发布时间:2020-12-16 07:04:58 所属栏目:百科 来源:网络整理
导读:当然,我想知道一些神奇的解决办法,但我愿意重组. 所以我有一个类DeviceDependent,具有以下构造函数 DeviceDependent(Device device); 它存储对设备的引用.设备可以更改状态,这将需要更改依赖于该设备的所有DeviceDependent实例. (你猜对了,这是我试驾骑Direc
当然,我想知道一些神奇的解决办法,但我愿意重组.

所以我有一个类DeviceDependent,具有以下构造函数

DeviceDependent(Device& device);

它存储对设备的引用.设备可以更改状态,这将需要更改依赖于该设备的所有DeviceDependent实例. (你猜对了,这是我试驾骑DirectX野兽的微不足道的尝试)

为了解决这个问题,我有函数DeviceDependent :: createDeviceResources(),DeviceDependent :: onDeviceLost().

我计划将每个DeviceDependentinstance注册到DeviceDependent构造函数中指定的设备.设备将保持std :: vector< DeviceDependent *>如此注册的所有DeviceDependent实例然后它将遍历该向量并在适当时调用上述函数.

这看起来很简单,但我特别喜欢的是我可以有一个std :: vector< DeviceDependent(或child)>代码中的其他位置并快速迭代它们.例如,我有一个Renderable类,顾名思义表示一个可渲染的对象,我需要至少迭代一次这一帧,因此我不希望对象分散在整个内存中.

下到业务,这是问题:

当我创建固体对象时,我依赖于移动语义.这纯粹是出于本能,我没有考虑复制像这样的大型对象将它们添加到std :: vector< DeviceDependent(或child)>采集. (仍然厌恶这个想法)

但是,使用移动语义(我已经为那些不相信它的人测试了这个),对象的地址会发生变化.调用默认构造函数后,它会发生更改.这意味着我的代码在DeviceDependant的构造函数中调用device.registerDeviceDependent(this)编译并运行正常,但是设备会累积一个指针列表,一旦对象移动到向量中,这些指针就会失效.

我想知道是否有某种程度上我可以坚持这个计划并让它发挥作用.

我想到的事情:

>使’真实’向量成为共享指针的集合,没有问题复制.该对象可能不会改变地址.我不喜欢这个计划,因为我担心将事情留在堆上会损害迭代性能.
>在对象移动后调用寄存器,这是我暂时做的但是我不喜欢它,因为我觉得构造函数是适当的地方.那里
不应存在??某个设备清单上没有的DeviceDependent实例.
>编写自己的移动构造函数或移动赋值函数.这样我就可以从设备中删除旧地址并将其更改为新地址.我不想这样做,因为我不想随着课程的发展不断更新它.

解决方法

这与移动构造函数无关.问题是std :: vector.向该向量添加新项时,它可能会重新分配其内存,这将导致所有DeviceDependant对象被传输到向量内部的新内存块.然后将构建每个项目的新版本,并删除旧版本.施工是复制施工还是移动施工是无关紧要的;这两个对象有效地改变了它们的地址.

为了使代码正确,DeviceDependant对象需要在析构函数中注销自己,并在copy-move和move-constructors中注册自己.如果您没有删除那些构造函数,那么无论您决定使用什么存储,都应该这样做.否则那些构造函数,如果被调用,将会做错误的事情.

不在列表中的一种方法是通过调用reserve()来阻止向量重新分配,其中包含您将存储的最大项目数.只有在知道DeviceDependant对象数量的合理上限时,这才是实用的.但是,您可能会发现保留估计值而不是完全消除向量重新分配,这使得取消注册和重新注册的成本变得微不足道的情况非常罕见.

听起来你的目标是获得DeviceDependants的缓存一致性.您可能会发现使用std :: deque作为主存储可以避免重新分配,同时仍然提供足够的缓存一致性.或者您可以通过编写自定义分配器或运算符new()来获得缓存一致性.

顺便说一句,听起来你的设计是由你只是猜测的性能成本驱动的.如果您实际测量它,您可能会发现使用std :: vector>很好,并没有显着迭代它们所花费的时间. (注意,这里不需要共享指针,因为向量是唯一的所有者,因此可以避免引用计数的开销.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读