- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我收藏了 Creature
使用 std::make_shared
在我的应用程序的一部分中创建和拥有的对象和 std::shared_ptr
.
我还跟踪了零个或一个的选择 Creature
在World
使用 std::weak_ptr<Creature>
的对象.
void World::SetSelection(const std::shared_ptr<Creature>& creature) {
selection = creature;
}
std::shared_ptr<Creature> World::GetSelection() const {
return selection.lock();
}
GetSelection
的来电者负责检查指针是否为空。如果是,则表示当前没有选择。
This all works perfectly to my liking: when the selected Creature
死于自然原因(在申请的其他地方),GetSelection
开始返回 nullptr
再次好像什么都没有被选择。
但是在那种情况下 World::selection
成员仍然指向 std::shared_ptr
的控制 block 。这可能很大,因为我使用 std::make_shared
创建我的 Creature
对象(我意识到 Creature
对象在正确的时间被正确销毁,但它的内存仍然被分配)。我正在考虑更改 GetSelection
对此:
std::shared_ptr<Creature> World::GetSelection() {
const auto ret = selection.lock();
if (!ret)
selection.reset();
return ret;
}
这会在我发现不再需要内存时立即释放内存。恼人的是,这个版本的GetSelection
不能是 const
.
哪个版本GetSelection
在这种情况下会被认为是最佳实践吗?
如果在模板代码中发生类似的事情,答案是否会改变,其中 sizeof(T)
是未知的,可能是巨大的?或者在 C++14 中 std::make_shared<T[]>
可以参与吗?
如果第二个版本总是最好的,那么 std::weak_ptr<T>::expired
的基本原理是什么?和 lock
自己不做?
最佳答案
首先应该注意的是,std::make_shared
的放置策略是可选的,即标准不强制执行此优化。这是一个非约束性要求,这意味着完全符合要求的实现可能会选择放弃它。
回答您的问题:
鉴于您似乎只有一个选择(因此您并没有通过保留许多这样的控制 block 来增加内存使用量),我主张保持简单。内存是瓶颈吗?这对我来说是微优化。您应该编写更简单的代码,您可以在其中应用 const
,然后在需要时返回并稍后进行优化。
答案不会无条件地改变,它会根据问题域和你的瓶颈是什么而改变。如果您正在分配一个“巨大”的对象(比如一百千字节),并且该对象的空间在一个相对未使用的控制 block 中四处游荡,直到被替换,这可能不是您的瓶颈,而且可能不值得编写更多代码(本质上更容易出错、难以维护和破译)来“解决”。
由于std::weak_ptr::lock
和std::weak_ptr::expired
是const
,在解释下const
对于 C++11,它们必须是线程安全的。因此,给定一些 std::weak_ptr
,同时调用 lock()
和 expired()
的任意组合必须是安全的。在引擎盖下,std::weak_ptr
存储一个指向控制 block 的指针,它通过它查看检查/增量/等。原子计数器来确定对象是否已经过期,或者看它是否可以获取锁。如果您想在 std::weak_ptr
内部实现优化,您必须以某种方式检查控制 block 的状态,然后在指针过期时自动删除指向控制 block 的指针。这会在每次访问 std::weak_ptr
时产生开销(即使这可以简单地用原子完成,它仍然会有开销),所有这些都是为了一个小的优化。
关于c++ - 如果我碰巧注意到它已过期,我应该在 weak_ptr 上调用 reset 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25274871/
难眠 碰巧 初懵 枕夢 归你 途往 抉择 浮梦 空痕 成书 抖落 描眉 独活 南戈 迟归 零點 旧颜 起伏 防御 言己 淡忘 陌语 
我是一名优秀的程序员,十分优秀!