深拷贝 与 浅拷贝 验证

SV中的深拷贝与浅拷贝:原理、区别与应用场景全解析 本文全面解析SystemVerilog(SV)中的深拷贝与浅拷贝原理、区别与应用场景。通过对比内存模型和实际代码示例,详细阐述浅拷贝的快速共享特性与潜在风险,以及深拷贝的完全独立性实现方法。针对验证环境开发,提供拷贝策略选择矩阵和性能优化技巧,帮助开发者在SV项目中做出明智的拷贝方式决策。 阅读详情

验证内容:

    浅拷贝:是指将对象的所有字段复制到一个新对象。
             对值类型字段只是简单的拷贝一个副本到目标对象,改变对象中值类型字段的值不会反映到原始对象中,因为拷贝的是副本。
             引用型字段则是拷贝他的一个引用到目标对象.改变目标对象中引用类型字段的值它反映到原始对象中,因为拷贝的是指向堆上的一个地址。
    深拷贝和浅拷贝不同的是对于引用字段的解决,深拷贝将会新对象中创建一个新对象和原始对象中对应字段相同(内容相同)字段也就说这个引用和原始对象引用不同 我们改变新对象中这个字段时候不会影响到原始对象中对应字段内容。



    [Serializable]//深拷贝必须要可序列化
    public class MyClassA : ICloneable
    {
        private int a = 0;

        public int A
        {
            get { return a; }
            set { a = value; }

        }

//引用类型

        MyObj obj = null;

        public MyObj Obj
        {
            get { return obj; }
            set { obj = value; }
        }

        private string b = string.Empty;

        public string B
        {
            get { return b; }
            set { b = value; }
        }


        #region ICloneable 成员
//浅拷贝
        public object Clone()
        {
            return this.MemberwiseClone() as MyClassA ;
        }

        #endregion

//深拷贝

        public object DeepClone()
        {
            MemoryStream stream = new MemoryStream();
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(stream, this);
            stream.Position = 0;
            return formatter.Deserialize(stream) as MyClassA;
        }
    }

    [Serializable]//引用类型也必须为可序列化
    public class MyObj
    {
        int pk = 100;

        public int Pk
        {
            get { return pk; }
            set { pk = value; }
        }
        string name = string.Empty;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        public MyObj(string n)
        {
            this.name = n;
        }

    }

//测试

    public class TestClone
    {
        public TestClone()
        {
            MyClassA a = new MyClassA();
            a.A = 100;
            a.B = "Hello World!";
            //创建一个新对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的,则对该字段执行逐位复制。
            //如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象。
            MyObj myobj = new MyObj("a");
            a.Obj = myobj;

            MyClassA b = a.Clone() as MyClassA;//浅拷贝
            MyClassA c = a.DeepClone() as MyClassA;//深拷贝

            a.Obj.Name = "b";//更改引用类型 中数据
            a.A = 1000;

            a.B = "good";


            Console.WriteLine(a.A.ToString());
            Console.WriteLine(a.B.ToString());
            Console.WriteLine(a.Obj.Pk);
            Console.WriteLine(a.Obj.Name);
            Console.WriteLine("");

            Console.WriteLine(b.A.ToString());
            Console.WriteLine(b.B.ToString());
            Console.WriteLine(b.Obj.Pk);
            Console.WriteLine(b.Obj.Name);
            Console.WriteLine("");

            Console.WriteLine(c.A.ToString());
            Console.WriteLine(c.B.ToString());
            Console.WriteLine(c.Obj.Pk);
            Console.WriteLine(c.Obj.Name);
        }

    }


结果:

--原对象输出

1000
good
100
b   (更改)
--浅拷贝输出
100
Hello World!
100
b   (更改)

--深拷贝输出
100
Hello World!
100
a



WPF基础系列六:MVVM框架 MVVM框架 文章目录MVVM框架前言一、MVVM框架简介1. 什么是MVVM?2. MVVM的优势3.MVVM的应用场景二、MVVM使用及示例 前言 在WPF开发中,经典的编程模式是MVVM,是为WPF量身定做的模式,该模式充分利用了WPF的数据绑定机制,最大限度地降低了Xmal文件和CS文件的耦合度,也就是UI显示和逻辑代码的耦合度,如需要更换界面时,逻辑代码修改很少,甚至不用修改。 与WinForm开发相比,我们一般在后置代码中会使用控件的名字来操作控件的属性来更新UI,而在WPF中通常是通过 阅读详情

相关推荐

利用gprMax与Matlab实现SFCW雷达信号的高效仿真与优化

本文详细介绍了如何结合gprMax与Matlab实现SFCW雷达信号的高效仿真与优化。通过利用gprMax获取地下场景的冲激响应,并在Matlab中运用卷积与信号处理技术,可大幅提升SFCW雷达系统仿真的效率与灵活性,为探地雷达研究与设计提供强大工具。

book8的博客 706

如何判断一个对象是被浅拷贝还是深拷贝的?

通过比较拷贝对象和原始对象中引用类型属性的引用是否相同来判断。如果引用相同,则为浅拷贝;如果引用不同,则可能是深拷贝。通过以上方法,你可以判断一个对象是被浅拷贝还是深拷贝。需要注意的是,对于一些复杂的对象,可能需要更完善的判断逻辑。可以通过手动修改拷贝对象中引用类型的属性,然后检查原始对象中对应的属性是否发生变化来判断是浅拷贝还是深拷贝。

weixin_53541596的博客 402

14自由度汽车动力学模型

多体系统分解簧上质量刚体:包含车身主体,具有6个自由度(x/y/z平移 + 俯仰/侧倾/横摆旋转)四个簧下质量刚体:每个车轮独立建模,含垂直跳动(z向)和旋转(绕z轴)自由度总自由度:6(车身) + 4×2(车轮) = 14自由度。

chao189844的博客 1197

理解浅拷贝和深拷贝以及实现方法

浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会修改到原对象。

铁锤妹妹的博客 5858

STM32G0定时器中断实战:HAL库配置TIM2实现精准1秒LED闪烁(附完整代码)

本文深入解析了STM32G0系列微控制器中定时器中断的配置与应用,重点介绍了如何使用HAL库配置TIM2实现精准的1秒LED闪烁。通过详细讲解时钟树分析、预分频系数与自动重装载寄存器的计算原理,并结合CubeMX图形化配置与完整代码示例,帮助开发者从底层理解定时器工作机制,掌握可复用的工程化配置方法。

weixin_29194817的博客 253

实战指南:用Python实现ONVIF WS-Discovery设备发现(附完整代码)

本文提供了一份详细的实战指南,介绍如何使用Python实现基于ONVIF标准的WS-Discovery设备发现协议。文章深入解析了协议原理、网络通信模型,并提供了完整的代码实现,帮助开发者快速构建智能安防和物联网应用中的设备自动发现工具,有效提升网络设备集成与管理的效率。

chair的专栏 1114

结构的浅拷贝验证

看见开源软件中 将两个结构直接赋值,做个试验,验证

博客标题不能为空 998

SDIO_WiFi驱动学习之安卓WLAN架构介绍及调用流程分析

一、引言 上一篇博客大概介绍了MMC子系统和SDIO相关知识及架构,这一篇博客则大致分析安卓的WLAN架构及上层如何调用WLAN驱动的流程。 虽然我工作的开发环境是安卓系统,但由于我不是专业的安卓应用/框架开发工程师,所以对安卓层的一些代码并不是特别熟悉,只能大致梳理流程,不专业的地方请谅解。 本文部分内容摘抄自网络,若有侵权,请联系删除。 二、安卓WLAN架构 1、应用框架(Application framework) 在应用程序框架级别是应用程序代码,它使用各种android.net..

陈子陌的博客 5088

深拷贝的证明

起源于一次笔试,关于string类的赋值,自定义赋值运算符,演变到证明这种带指针的类。在深拷贝前后,指针成员指向的内存空间地址不同 赋值要考虑,是否自我赋值, 如果不是自我赋值,则回收原来占用的空间,申请新空间,将赋值的内容拷贝到新空间 #include "stdafx.h" #include <iostream> #include <vector> #include &l...

qq_41133291的博客 114

大众奥迪诊断不求人:手把手解析SAE J2819(CAN TP2.0)协议报文与连接流程

本文深入解析大众奥迪车型诊断核心标准SAE J2819(CAN TP2.0)协议,详细拆解连接建立流程与报文控制字段。通过实战案例展示通道设置、参数协商等关键步骤,提供诊断设备配置建议和常见故障排查技巧,帮助工程师掌握汽车诊断通信协议的精髓。

weixin_30421809的博客 397

17、超声散斑降噪与桌面系统背景估计技术

本文介绍了超声散斑降噪与桌面系统背景估计的先进技术。在超声成像方面,提出结合超分辨率(SR)和非线性扩散(ND)的方法,显著降低噪声并保留图像细节,在MSE和CNR指标上优于传统方法。在桌面交互系统中,针对传统背景估计因忽略设备像素结构导致的误差,提出基于显示器与相机像素结构建模的几何转换方法,有效减少尖锐边缘区域的误检,提升物体识别准确性。实验验证了两种方法的有效性,未来将致力于实时性优化与多设备兼容性扩展。

dream的博客 87

深拷贝与浅拷贝及如何实现深拷贝

先记住两句话,帮助你简单理解一下深拷贝和浅拷贝的区别: 1 深拷贝拷贝后,产生数据是两条数据 2 浅拷贝拷贝后,多个变量共用一条数据 下面,我们来看个例子: var a = [1,2,3]; var a1 = a; a1[0] = 2; console.log(a); // ==>Array(3) [ 2, 2, 3 ] 是不是很奇怪,明明改变的是数组a1中的值,为什么数组a中的值也跟着改变了,这就不得不让人深思了。 那么这里,就需要引入基本数据类型和引用数据类型的概念了。

qq_42673485的博客 1448

PCL 直通滤波器【2026最新版】

PCL直通滤波器函数详解以及用于多字段滤波、强度滤波、获取某一时间范围内的点等高阶用法案例分享。博客长期更新,本文最近一次更新时间为:2026年3月11日。

点云侠的博客 40万+

【IC验证】SystemVerilog基础:类对象的浅拷贝与深拷贝

SystemVerilog中类变量的复制操作分为三种:句柄赋值、浅拷贝和深拷贝。句柄赋值仅复制对象句柄,新旧句柄指向同一对象;浅拷贝会创建新外层对象,但内部句柄成员仍指向原对象;深拷贝则完全复制所有层次的对象,包括内部对象。通过bag和book类的示例演示了三者的区别:句柄赋值使两个变量共享同一对象,浅拷贝创建独立外层对象但共享内部对象,而深拷贝则完全复制所有对象层次结构。理解这些概念对正确管理对象关系至关重要。

双摆的博客 330

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

关于System.arraycopy()是深拷贝还是浅拷贝的一些想法和验证

浅拷贝 深拷贝 arraycopy 数组 克隆 java 栈 堆

weixin_52502987的博客 488

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

验证 vector = 是深拷贝还是浅拷贝

#include <vector> using namespace std; int main() { int w=1920; int h = 1080; vector<int> dataA( w*h ,0Xff); vector<int> dataB = dataA; int * ptr0 = &data...

weixin_30354675的博客 4593

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Objective-C之 深拷贝和浅拷贝、copy和mutableCopy(可以验证下)

基础概念 深拷贝和浅拷贝:是否会产生新对象 深拷贝:内容拷贝,会产生新的对象 浅拷贝:指针拷贝,不会产生新的对象 copy和mutableCopy:对于产生的对象的可变性而言(前提是产生了新对象) copy出来的对象不可变 mutableCopy出来的对象可变 验证非容器类对象* 对非容器类不可变对象copy测试代码NSString *iStr = @"lixue1"; NSString *c

li15809284891的专栏 550

SystemVerilog验证中的深拷贝与浅拷贝:原理、实现与避坑指南

在面向对象编程和硬件验证语言中,对象拷贝分为浅拷贝与深拷贝两种核心机制。浅拷贝仅复制对象的引用(句柄),导致新旧对象共享同一内存数据;而深拷贝则创建对象的完全独立副本,包括其所有嵌套的动态数据。理解这一原理对于确保数据隔离、避免内存泄漏和保证仿真正确性至关重要。在SystemVerilog验证中,事务对象的频繁传递、存储和比较对拷贝机制提出了严苛要求。通过自定义拷贝构造函数、利用UVM框架的clone方法或流操作符等技术方案,可以实现高效可靠的深拷贝。本文结合内存泄漏等典型问题,深入探讨了在记分板、序列生成

weixin_34032792的博客 366

面试:说一下深拷贝,浅拷贝,引用拷贝吧;Object类中的clone是哪种呢?

● 浅拷贝: 对基本数据类型进行值传递;:Object 的 clone 方法是一个浅拷贝,如果它拷贝的对象中有其他对象,那么其中的对象是不会得到彻底的拷贝。● 深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。深拷贝是彻底的拷贝,两对象中所有的成员都是独立的一份,而且,成员对象中的成员对象也是独立一份。● 引用拷贝: 是对引用地址的拷贝,说明引用地址一样,指向堆中的对象是同一个对象。浅拷贝中的某些成员变量可能是共享的,深拷贝如果不够彻底,就是浅拷贝。

记录学习路上的每一个 “啊哈!” 时刻 欢迎交流,共同进步! 1363

C++内置STL容器的深拷贝和浅拷贝(含代码验证)

func前: &a=0x7ffe48baa370。func后: &a=0x7ffe48baa370。func前: &a=0x7ffd83849330。func后: &a=0x7ffd83849330。func前: &a=0x7ffffedd7d10。func后: &a=0x7ffffedd7d10。func前: &a=0x7ffff21844d0。func后: &a=0x7ffff21844d0。func前: &a=0x7ffedfb16e60。func后: &a=0x7ffedfb16e60。

m0_64683024的博客 760

自定义校验及浅谈深拷贝和浅拷贝

表单校验及深拷贝和浅拷贝

v610379640的博客 307

python学习之【深拷贝】

python中的深拷贝问题

沃和莱特的博客 690

深拷贝与浅拷贝

通过上述实验,我们可以发现Object类的拷贝默认是浅拷贝。当student1实例修改了name的时候,student2实例的name的值也发生了变化,因此由此可以看出来他们是使用的同一个对象。通过上述实验,我们可以发现当student1实例修改了name的时候,student2实例的name的值并没有发生变化,还是原来的值,因此由此可以看出来他们是使用的是不同的对象。浅拷贝指的是不同的引用指向同一个对象。深拷贝指的是不同的引用指向不同的对象。

weixin_51604685的博客 336

Java中的深拷贝与浅拷贝

深拷贝和浅拷贝区别是什么? 数据分为基本数据类型和引用数据类型。基本数据类型:数据直接存储在栈中;引用数据类型:存储在栈中的是对象的引用地址,真实的对象数据存放在堆内存里。 浅拷贝:对于基础数据类型:直接复制数据值;对于引用数据类型:只是复制了对象的引用地址,新旧对象指向同一个内存地址,修改其中一个对象的值,另一个对象的值随之改变。 深拷贝:对于基础数据类型:直接复制数据值;对于引用数据类型:开辟新的内存空间,在新的内存空间里复制一个一模一样的对象,新老对象不共享内存,修改其中一个对象的值,不会影响另.

兴趣使然的草帽路飞 1万+

浅谈C++深浅拷贝

关于C++的浅拷贝和深拷贝的分析

RX_beginner的博客 384

a=b、深拷贝和浅拷贝

本文比较了三种Python对象复制方式的差异:(1)直接赋值b=a会创建指向同一内存的别名,任何修改都会同步;(2)浅拷贝b=a[:]或b=a.copy()会创建新对象,但嵌套内容仍共享,修改嵌套结构会影响原对象;(3)深拷贝b=copy.deepcopy(a)会递归复制所有层级,创建完全独立的新对象。通过二维列表的示例验证了三种方式的特性差异,揭示了内存共享程度是核心区别:从完全共享到部分共享再到完全不共享。

qq_46170459的博客 389
上一篇: There is already an open datareader associated with this command引发的问题
下一篇: Design_Pattern-Prototype
andycode
博客等级 码龄17年 12粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值