当前位置: 首页 > 面试题库 >

如何制作具有写时复制语义的容器?(迅速)

堵宏毅
2023-03-14
问题内容

我有一个非常大的结构,我想确保不会不必要地复制它。如何为它制作一个写时复制容器?


问题答案:

写入时复制通常是struct某些支持对象的包装。

public final class MutableHeapStore<T>: NonObjectiveCBase
{
    public typealias Storage = T

    public private(set) var storage: Storage

    public init(storage: Storage)
    {
        self.storage = storage
    }
}

public struct COW<T>
{
    public typealias Storage = MutableHeapStore<T>
    public typealias Value = T

    public var storage: Storage

    public init(storage: Storage)
    {
        self.storage = storage
    }

    public var value: Value
    {
        get
        {
            return storage.storage
        }

        set
        {
            if isUniquelyReferenced(&storage)
            {
                storage.storage = newValue
            }

            else
            {
                storage = Storage(storage: newValue)
            }
        }
    }

    public init(_ value: Value)
    {
        self.init(storage: Storage(storage: value))
    }
}

extension COW: CustomStringConvertible
{
    public var description: String
    {
        return String(value)
    }
}

诀窍在于isUniquelyReferenced每次盒装值发生突变时都要断言。如果单独引用了基础存储对象,则无需执行任何操作。但是,如果存在另一个引用,则必须创建一个新的存储。

此代码是线程安全的吗?它与任何其他值类型(例如Int或)一样安全Bool



 类似资料:
  • 我试图在Tripadvisor中收集多家酒店的评论,我能够收集150个观察数据,其中包括来自30家酒店的150个评论数据。 但是,当我尝试添加hotel_name的新列并执行爬网时,hotel name不会再次出现,观察次数会减少到hotel的数量,即30。如何将酒店名称复制到每个审阅行? 这是我正在使用的代码:

  • 对于我正在编写的聊天机器人,我想让它的解析器可定制,这样人们就不需要修改机器人本身来为他们想要的任何类型的聊天消息添加钩子。解析器使用语法。目前,我用一个类似这样的类来处理这个问题: 然后,将从解析器的actions类中循环一个数组。这允许人们为解析器添加他们自己的“规则”,这解决了我的问题,但这是笨拙的,这是重新发明语法!我真正想要的是人们能够为我的解析器写一些类似俚语的东西。虽然可以用于此,但

  • 我有一个运行在Ubuntu16.04上的amazon web服务器。此服务器专用于运行由多个进程组成的模拟。我被赋予了创建docker容器的任务,以便可以在服务器上同时运行模拟的多个实例。我知道运行多个容器需要为每个容器更改一些端口ID,所以我的第一个任务是在一个容器中运行一个模拟实例。看来我可以在dockerFile中调用所有必要的软件映像来创建我的映像文件。但我想知道是否有一个更简单的方法来创

  • 网上搜索到cpp代码制作自定义的定时器,我制作了测试用的项目,仓库是:https://gitee.com/chanchaw/custom-timer-cc.git 测试下来发现在 main 函数中启动定时任务后,下面的 cout 没有输出到控制台中,是不是意味着定时任务没有创建子线程执行?如果是的话要如何修改代码?

  • 更多面试题总结请看:【面试题】技术面试题汇总 Copy-on-write 简介 写时复制(Copy-on-write,COW),有时也称为隐式共享(implicit sharing)。COW 将复制操作推迟到第一次写入时进行:在创建一个新副本时,不会立即复制资源,而是共享原始副本的资源;当修改时再执行复制操作。通过这种方式共享资源,可以显著减少创建副本时的开销,以及节省资源;同时,资源修改操作会增

  • 问题内容: 当大小为非本机时,我希望有一个内嵌svg元素的内容比例。当然,我可以将其作为单独的文件并像这样进行缩放。 index.html: foo.svg: 但是,我想通过CSS向SVG添加其他样式,因此链接外部样式不是一种选择。如何制作嵌入式SVG秤? 问题答案: 要独立于SVG图像的缩放大小指定SVG图像内的坐标,请使用SVG元素上的属性来定义图像的边界系统在图像的坐标系中,并使用和属性来定