深拷贝 浅拷贝 内存零拷贝

                      深拷贝与浅拷贝探析  内存零拷贝
   1.深拷贝 

 深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。举个例子,一个人名叫张三,后来用他克隆(假设法律允许)了另外一个人,叫李四,不管是张三缺胳膊少腿还是李四缺胳膊少腿都不会影响另外一个人。比较典型的就是Value(值)对象,如预定义类型Int32,Double,以及结构(struct),枚举(Enum)等。

考虑以下写法

       int source = int.MaxValue;//(1)初始化源对象为整数的最大值2,147,483,647

            int dest = source;//(2)赋值,内部执行深拷贝

            dest = 1024;//(3)对拷贝对象进行赋值

            source = 2048;//(4)对源对象进行赋值

    首先(2)中将source赋给dest,执行了深拷贝动作,其时dest和source的值是一样的,都是int.MaxValue;(3)对dest进行修改,dest值变为1024,由于是深拷贝,因此不会运行source,source仍然是int.MaxValue;(4)对source进行了修改,同样道理,dest仍然是1024,同时int.MaxValue的值也不变,仍然是2,147,483,647;只有source变成了2048。

       再考虑以下写法

        struct Point

        {

            public int X;

            public int Y;

            public Point(int x, int y)

            {

                X = x;

                Y = y;

            }

        }

 

        Point source = new Point(10, 20);

        Point dest = source;

 

        dest.X = 20

     当dest.X属性变成20后,source的X属性仍然是10

2.浅拷贝
       浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(名称不同)。对其中任何一个对象的改动都会影响另外一个对象。举个例子,一个人一开始叫张三,后来改名叫李四了,可是还是同一个人,不管是张三缺胳膊少腿还是李四缺胳膊少腿,都是这个人倒霉。比较典型的就有Reference(引用)对象,如Class(类)。

考虑以下写法

        class Point

        {

            public int X;

            public int Y;

            public Point(int x, int y)

            {

                X = x;

                Y = y;

            }

        }

 

        Point source = new Point(10, 20);

        Point dest = source;

   dest.X = 20;

由于Point现在是引用对象,因此Point dest=source的赋值动作实际上执行的是浅拷贝,最后的结果应该是source的X字段值也变成了20。即它们引用了同一个对象,仅仅是变量明source和dest不同而已。

  3.零拷贝

用户进程和驱动共享同一块物理内存,使得它们之间不需要数据拷贝,这就是零拷贝策略。零拷贝策略的关键是mmap系统调用,也就是把内核存储空间映射到用 户进程空间的方法,它使应用程序和内核空间共享物理内存成为可能。实现的方法是,在内核空间申请一片内存,即用作这里所说的循环缓冲区,然后用户进程调用 设备的mmap函数来将内核的虚拟地址空间映射到进程的地址空间。因此我们的设备驱动程序需要编写mmap方法,但是在下面我们会看到,因为我们采取了十 分巧妙的内存分配措施,驱动不需要mmap方法,而只需要调用/dev/mem的mmap方法。
实现零内存拷贝后,用户程序和驱动程序之间的循环缓冲区同步就变得比较简单了,我们取消了一般驱动设计的阻塞型IO(当然任何时候都可以实现非阻塞型IO 操作),即不需睡眠等待队列,并编写设备驱动的ioctl方法为应用程序提供前移head指针的操作。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中的深拷贝浅拷贝涉及到对象的复制和内存回收的问题。 浅拷贝是创建一个新的对象,但是其内部的子对象仍然是原对象的引用。也就是说,浅拷贝创建了一个新的对象,但是这个新对象中的数据只是原对象中数据的引用。当原对象中的数据发生改变时,浅拷贝的新对象也会受到影响。浅拷贝通常使用`copy`模块的`copy`函数来实现。 深拷贝是创建一个全新的对象,并且递归地复制原对象及其所有子对象。深拷贝创建了一个与原对象完全独立的新对象,包括其中的所有数据。当原对象中的数据发生改变时,深拷贝的新对象不会受到影响。深拷贝通常使用`copy`模块的`deepcopy`函数来实现。 关于内存回收方面,Python中有一种自动内存管理机制称为垃圾回收(Garbage Collection)。当一个对象不再被引用时,垃圾回收机制会自动将其所占用的内存释放,以便在后续的程序中可以重新使用。对于浅拷贝深拷贝来说,它们都不会直接影响内存回收机制的工作。无论是浅拷贝还是深拷贝,只有当对象不再被引用时,垃圾回收机制才会释放其所占用的内存。 需要注意的是,在使用深拷贝时,由于会复制整个对象及其子对象,可能会导致更多的内存占用。因此,在选择使用深拷贝还是浅拷贝时,需要根据具体情况来权衡内存占用和数据共享的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值