একটি গভীর অনুলিপি এবং অগভীর অনুলিপি মধ্যে পার্থক্য কি?


754

একটি গভীর অনুলিপি এবং অগভীর অনুলিপি মধ্যে পার্থক্য কি?


6
এটি কোন প্রযুক্তির আওতায় আসে?
সুরেশ ভার্মা

42
@ সুরেশ ভার্মা, এটি একটি প্রোগ্রামিং ধারণা!
মনিশ শ্রীবাস্তব

উত্তর:


759

অগভীর কপিগুলি যতটা সম্ভব নকল করুন। একটি সংগ্রহের অগভীর অনুলিপি উপাদান কাঠামোর অনুলিপি। অগভীর অনুলিপি সহ দুটি সংগ্রহ এখন পৃথক উপাদানগুলি ভাগ করে।

গভীর অনুলিপি সব কিছু নকল। মূল সংগ্রহের অনুলিপিযুক্ত সমস্ত উপাদান সহ একটি সংগ্রহের একটি গভীর অনুলিপি দুটি সংগ্রহ।


হতে পারে। নেট সদস্যপদে ক্লোন () বাস্তবায়ন প্রচলিত অর্থে অগভীর অনুলিপি করার চেয়ে আরও বেশি কিছু করতে পারে
Lu55

5
মনে রাখবেন মিশ্র অনুলিপিগুলি (যেমন অলস অনুলিপি নয় ) রয়েছে, যা এর কেবলমাত্র নকল করে দেয় ( এখানে একটি উদাহরণ রয়েছে )! ;)
ক্রেগক্স

সুতরাং এক্স এর অগভীর অনুলিপি এক্সের উপাদানগুলিকে পরিবর্তন করতে পারে তবে গভীর অনুলিপি করতে পারে না?
পুস্ট্রেস

1
সংগ্রহ কাঠামো কী?
মধু 21

1
@ মধু সংগ্রহগুলি বিভিন্ন ডেটা স্ট্রাকচার হতে পারে যা একাধিক ডেটা আইটেম সঞ্চয় করে। অজগরতে আমাদের কাছে টুপল, তালিকা, ডিকশনারি ইত্যাদি রয়েছে
মার্ফি

850

প্রস্থ বনাম গভীরতা; আপনার বস্তুর সাথে মূল নোড হিসাবে রেফারেন্সের গাছ হিসাবে বিবেচনা করুন।

অগভীর:

কপি করার আগে অগভীর অনুলিপি অগভীর কাজ শেষ

ভেরিয়েবলগুলি এ এবং বি মেমোরির বিভিন্ন ক্ষেত্রকে নির্দেশ করে, যখন বি এ-কে নির্ধারিত হয় দুটি ভেরিয়েবল একই মেমরির ক্ষেত্রকে নির্দেশ করে। পরে যে কোনও বিষয়বস্তুতে পরিবর্তনগুলি তত্ক্ষণাত্ অন্য সামগ্রীতে প্রতিফলিত হয়, কারণ তারা সামগ্রী ভাগ করে দেয়।

ডীপ:

কপি করার আগে গভীর কপি করা গভীর সম্পন্ন

ভেরিয়েবলগুলি এ এবং বি মেমোরির বিভিন্ন ক্ষেত্রকে নির্দেশ করে, যখন বি মেমোরি ক্ষেত্রের মানগুলিকে এ-তে নির্ধারিত হয় যা এটিকে বিন্দুতে মেমরি অঞ্চলে নীতিবদ্ধ করে যা বি বিন্দুতে নির্দেশ করে। পরবর্তীকালে এর লিখিত সামগ্রীর পরিবর্তনগুলি এ বা বিতে অনন্য থেকে যায়; বিষয়বস্তু ভাগ করা হয় না।


32
এখানে Wikipedia নিবন্ধটি যে এই চিত্রণ ক্ষেত্রে থেকে আসে এটা আপনার জন্য প্রসঙ্গের বাইরে অর্থে দেখা যায় না এর en.wikipedia.org/wiki/Object_copy#Shallow_copy
Corbin

4
অগভীর অনুলিপির ক্ষেত্রে যদি আমরা অ্যারে বিতে কোনও পরিবর্তন করি তবে এটি কি অ্যারে এ প্রতিবিম্বিত হবে যেহেতু এ এবং বি উভয়ই একই মেমরির অবস্থানকে নির্দেশ করে?
tek3

3
একক লাইনে এর অনুলিপি দ্বারা রেফারেন্স বনাম কপির মান অনুসারে। উত্তর সঠিক কিনা তা নিশ্চিত নই!
মান্নু

2
ছবিগুলি সরাসরি উইকিপিডিয়া থেকে উদ্ধৃতি ছাড়াই
তোলা হয়েছে

9
@ জেসনলোনহার্ড তাই 9 বছর আগে আমি কেবল চিত্রগুলিতে ইউআরএল রেখেছি কারণ চিত্রগুলি এম্বেড করা সমর্থন করে না। সুতরাং ইউআরএল এর উত্স উদ্ধৃত। সম্প্রদায়টি পরে এতে কোনও প্রকার উদ্ধৃতি সম্পাদনা না করেই এমবেড করা চিত্রগুলিতে ইউআরএলগুলি তৈরি করে। 4 বছরের পুরানো শীর্ষ মন্তব্যটি আপনাকে কী নির্দেশ করে তাও নির্দেশ করে। একবার দেখুন: স্ট্যাকওভারফ্লো.com / posts / 184780 / revisions কেন নিজের উত্তরে কেবল একটি উদ্ধৃতি সম্পাদনা করবেন না? পরের বার আমার 10 বছরের পুরানো লেখার স্টাইল সম্পর্কে কারও কাছে কিছু অভিযোগ থাকলে আমি অনুপলব্ধ হতে পারি।
dlamblin

156

সংক্ষেপে, এটি কোনটি নির্দেশ করে তা নির্ভর করে। অগভীর অনুলিপিতে, বস্তু বি মেমরির এ এর ​​অবস্থানকে আপত্তি করতে নির্দেশ করে। গভীর অনুলিপিতে, বস্তুর A এর মেমরি অবস্থানের সমস্ত জিনিস বি এর মেমরির অবস্থানটির জন্য অনুলিপি করা হয়।

এই উইকি নিবন্ধটিতে দুর্দান্ত চিত্র রয়েছে।

http://en.wikipedia.org/wiki/Object_copy


112

নিম্নলিখিত চিত্র বিবেচনা করার চেষ্টা করুন

এখানে চিত্র বর্ণনা লিখুন

উদাহরণস্বরূপ অবজেক্ট.মেমবারওয়াই ক্লোন একটি অগভীর অনুলিপি লিঙ্ক তৈরি করে

এবং ICloneable ইন্টারফেস ব্যবহার করে আপনি এখানে বর্ণিত হিসাবে গভীর অনুলিপি পেতে পারেন


28
একটি ছবি হাজার শব্দের সমান.
লেভি ফুলার

6
ওহ ছেলে, অর্থটি সন্ধান করতে এখানে এসেছিল। এটিই একমাত্র উত্তর যা সাহায্য করেছিল।
করণ সিং

1
এটি সহজ এবং এখনও প্রয়োজনীয় যা কেবল তা দেখায়।
hina10531

1
সেরা চিত্র
মুহাম্মদ নায়ব

69

বিশেষত আইওএস বিকাশকারীদের জন্য:

যদি Bএকটি হয় অগভীর কপি এর A, তারপর আদিম ডেটা মত জন্য B = [A assign];এবং বস্তু এটা কেমন জন্য B = [A retain];

বি এবং একই মেমরি অবস্থানের একটি বিন্দু

যদি Bএর একটি গভীর অনুলিপি হয় A, তবে এটির মতোB = [A copy];

বি এবং বিভিন্ন মেমরি অবস্থানের জন্য একটি বিন্দু

বি মেমরি ঠিকানা এ এর ​​মতোই

খ এর এ এর ​​মতো সামগ্রী রয়েছে


8
"বি মেমরি ঠিকানাটি এ এর ​​মতোই" - কীভাবে আসবেন?


60

অগভীর অনুলিপি: সদস্যের মানগুলি একটি বস্তু থেকে অন্য বস্তুতে অনুলিপি করে।

গভীর অনুলিপি: সদস্যের মানগুলি একটি বস্তু থেকে অন্য বস্তুতে অনুলিপি করে।
                     যে কোনও পয়েন্টার অবজেক্টগুলি নকল করে এবং ডিপ কপি করা হয়।

উদাহরণ:

class String
{
     int   size;
     char* data;
};

String  s1("Ace");   // s1.size = 3 s1.data=0x0000F000

String  s2 = shallowCopy(s1);
 // s2.size =3 s2.data = 0X0000F000
String  s3 = deepCopy(s1);
 // s3.size =3 s3.data = 0x0000F00F
 //                      (With Ace copied to this location.)

47

আমি এখানে একটি সংক্ষিপ্ত, সহজ উত্তরটি দেখতে পাইনি - তাই আমি এটি দিয়ে চেষ্টা করব।

অগভীর অনুলিপি সহ উত্স দ্বারা নির্দেশিত যে কোনও বস্তুর গন্তব্য দ্বারাও নির্দেশ করা হয় (যাতে কোনও রেফারেন্সযুক্ত বস্তু অনুলিপি না হয়)।

একটি গভীর অনুলিপি সহ, উত্স দ্বারা নির্দেশিত যে কোনও বস্তু অনুলিপি করা হয় এবং অনুলিপিটি গন্তব্য দ্বারা নির্দেশিত হয় (সুতরাং এখন প্রতিটি রেফারেন্সযুক্ত বস্তুর 2 থাকবে)। এটি বস্তু গাছকে পুনরুক্ত করে।



36

Two দুটি অবজেক্টের কল্পনা করুন: একই ধরণের A এবং B _t (সি ++ এর সাথে সম্মত) এবং আপনি এ থেকে বি-তে অগভীর / গভীর অনুলিপি করার বিষয়ে ভাবছেন}

অগভীর অনুলিপি: কেবল এ এর ​​বি এর রেফারেন্সের একটি অনুলিপি তৈরি করে এ এর ​​ঠিকানার একটি অনুলিপি হিসাবে এটি ভাবুন। সুতরাং, এ এবং বি এর ঠিকানাগুলি একই হবে অর্থাত তারা একই মেমরির অবস্থান অর্থাৎ ডেটা বিষয়বস্তুগুলিতে নির্দেশ করবে।

গভীর অনুলিপি: খালি এ এর ​​সমস্ত সদস্যের একটি অনুলিপি তৈরি করে, বি এর জন্য আলাদা স্থানে মেমরি বরাদ্দ করে এবং অনুলিপি করা সদস্যদের গভীর অনুলিপি অর্জনের জন্য বি তে নিয়োগ দেয়। এইভাবে, যদি এ অ-অযৌক্তিক হয়ে যায় তবে বি এখনও স্মৃতিতে বৈধ। ব্যবহারের সঠিক শব্দটি ক্লোনিং হবে, যেখানে আপনি জানেন যে তারা উভয়ই সম্পূর্ণ এক, তবে এখনও আলাদা (অর্থাত মেমরির জায়গাতে দুটি পৃথক সত্তা হিসাবে সঞ্চিত)। আপনি আপনার ক্লোন মোড়ক সরবরাহ করতে পারেন যেখানে আপনি অনুলিপি / বর্জনীয় তালিকার মাধ্যমে সিদ্ধান্ত নিতে পারবেন গভীর অনুলিপি করার সময় কোন বৈশিষ্ট্যগুলি নির্বাচন করতে হবে। আপনি এপিআই তৈরি করার সময় এটি বেশ সাধারণ অনুশীলন।

জড়িত অংশগুলি আপনি কেবলমাত্র শ্যালো অনুলিপি করতে বেছে নিতে পারেন understand আপনি যখন সি ++ বা সি এর সাথে ডিল করার জন্য প্রচুর সংখ্যক পয়েন্টার রেখেছেন তখন কোনও বস্তুর অগভীর অনুলিপি করা সত্যিই খারাপ ধারণা।

EXAMPLE_OF_DEEP COPY_ একটি উদাহরণ হ'ল আপনি যখন ইমেজ প্রসেসিং এবং অবজেক্টের স্বীকৃতি দেওয়ার চেষ্টা করছেন তখন আপনার প্রসেসিং অঞ্চলগুলির বাইরে "অপ্রাসঙ্গিক এবং পুনরাবৃত্ত গতি "টি মাস্ক করা দরকার। আপনি যদি ইমেজ পয়েন্টার ব্যবহার করে থাকেন তবে সেই মাস্ক চিত্রগুলি সংরক্ষণ করার জন্য আপনার কাছে স্পেসিফিকেশন থাকতে পারে। এখন ... আপনি যদি চিত্রটির অগভীর অনুলিপি করেন, যখন পয়েন্টার রেফারেন্সগুলি স্ট্যাক থেকে মেরে ফেলা হয়, আপনি রেফারেন্সটি এবং তার অনুলিপিটি হারিয়েছেন অর্থাৎ কোনও সময়ে অ্যাক্সেস লঙ্ঘনের একটি রানটাইম ত্রুটি থাকবে। এই ক্ষেত্রে, আপনার যা প্রয়োজন তা হ'ল এটি বন্ধ করে আপনার চিত্রের একটি গভীর অনুলিপি। ভবিষ্যতে আপনার যদি মুখোশের প্রয়োজন হয় তবে আপনি এটি পুনরুদ্ধার করতে পারেন।

EXAMPLE_OF_SHALLOW_COPY স্ট্যাকওভারফ্লোতে থাকা ব্যবহারকারীদের তুলনায় আমি খুব বেশি জ্ঞানবান নই তাই এই অংশটি মুছে ফেলতে নির্দ্বিধায় এবং যদি আপনি স্পষ্ট করতে পারেন তবে একটি ভাল উদাহরণ রেখে যেতে পারেন। তবে আমি সত্যিই মনে করি অগভীর অনুলিপি করা ভাল ধারণা নয় যদি আপনি জানেন যে আপনার প্রোগ্রামটি অসীম সময়ের জন্য চলবে অর্থাৎ ফাংশন কলগুলির সাথে স্ট্যাকের উপর অবিচ্ছিন্ন "পুশ-পপ" অপারেশন চলছে। যদি আপনি কোনও অপেশাদার বা নবজাতক ব্যক্তির কাছে কিছু প্রদর্শন করে থাকেন (যেমন সি / সি ++ টিউটোরিয়াল স্টাফ) তবে এটি সম্ভবত ঠিক আছে। তবে আপনি যদি নজরদারি এবং সনাক্তকরণ সিস্টেম, বা সোনার ট্র্যাকিং সিস্টেমের মতো কোনও অ্যাপ্লিকেশন চালিয়ে যাচ্ছেন তবে আপনার অজানা আপনার অনুলিপিগুলি অনুলিপি করা উচিত নয় কারণ এটি আপনার প্রোগ্রামটি শীঘ্রই বা পরে হত্যা করবে।


32
char * Source = "Hello, world.";

char * ShallowCopy = Source;    

char * DeepCopy = new char(strlen(Source)+1);
strcpy(DeepCopy,Source);        

'শ্যালোপি' স্মৃতিতে একই জায়গায় 'উত্স' হিসাবে দেখায়। 'ডিপকপি' স্মৃতিতে পৃথক অবস্থানের দিকে নির্দেশ করে তবে বিষয়বস্তু একই are


22

অগভীর কপি কি?

অগভীর অনুলিপি কোনও বস্তুর বিট বুদ্ধিযুক্ত অনুলিপি। একটি নতুন অবজেক্ট তৈরি করা হয়েছে যার মূল অবজেক্টের মানগুলির একটি অনুলিপি রয়েছে। যদি অবজেক্টের কোনও ক্ষেত্র অন্য অবজেক্টের রেফারেন্স হয় তবে কেবলমাত্র রেফারেন্স ঠিকানাগুলি অনুলিপি করা হয়, কেবলমাত্র মেমরির ঠিকানাটি অনুলিপি করা হয়।অগভীর কপি

এই চিত্র সালে MainObject1ক্ষেত্র রয়েছে field1টাইপ int-, এবং ContainObject1ধরণ ContainObject। আপনার একটি অগভীর কপি পেয়েছেন MainObject1, MainObject2সঙ্গে তৈরি করা হয় field2এর অনুলিপি মান ধারণকারী field1এবং এখনও নির্দেশিত ContainObject1নিজেই। নোট করুন যেহেতু field1আদিম ধরণের, তাই এর মান অনুলিপি করা হয়েছে field2তবে যেহেতু ContainedObject1একটি অবজেক্ট তাই MainObject2এখনও পয়েন্ট করে ContainObject1। করা যে কোনো পরিবর্তন তাই ContainObject1MainObject1প্রতিফলিত হবে MainObject2

এখন যদি এটি অগভীর অনুলিপি হয় তবে আসুন দেখে নেওয়া যাক গভীর অনুলিপিটি কী?

ডিপ কপি কি?

একটি গভীর অনুলিপি সমস্ত ক্ষেত্রের অনুলিপি করে এবং ক্ষেত্রগুলি দ্বারা নির্দেশিত গতিশীলভাবে মেমরির অনুলিপি তৈরি করে। একটি গভীর অনুলিপি ঘটে যখন কোনও বস্তু যার সাথে এটি উল্লেখ করা হয় তার সাথে অনুলিপি করা হয়। গভীর কপি

এই চিত্র সালে MainObject1 ক্ষেত্র আছে field1টাইপ int-, এবং ContainObject1ধরণ ContainObject। আপনার একটি গভীর কপি পেয়েছেন MainObject1, MainObject2সঙ্গে তৈরি করা হয় field2এর অনুলিপি মান ধারণকারী field1এবং ContainObject2এর কপি মান ধারণকারী ContainObject1। করা যে কোনো পরিবর্তন দ্রষ্টব্য ContainObject1মধ্যে MainObject1মধ্যে প্রতিফলিত হবে না MainObject2

ভাল নিবন্ধ


এটি আপনার দোষ নয় যদিও এই উদাহরণটি এমনটিকে বোঝায় field3যে যখন সমস্যাটির মতো গভীর কিছু বোঝার চেষ্টা করতে পারে, সেই উদাহরণটিতে কোথায় # 3 হচ্ছে ContainObject2 ?
রব_2015

16

অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ে কোনও ধরণের সদস্য ক্ষেত্রের সংগ্রহ অন্তর্ভুক্ত থাকে। এই ক্ষেত্রগুলি হয় মান দ্বারা বা রেফারেন্স দ্বারা (যেমন, একটি মানের একটি পয়েন্টার) সংরক্ষণ করা যেতে পারে।

অগভীর অনুলিপিতে, টাইপের একটি নতুন উদাহরণ তৈরি করা হয় এবং মানগুলি নতুন উদাহরণে অনুলিপি করা হয়। রেফারেন্স পয়েন্টারগুলিও মানগুলির মতোই অনুলিপি করা হয়। অতএব, রেফারেন্সগুলি মূল বস্তুর দিকে নির্দেশ করছে। রেফারেন্স দ্বারা সঞ্চিত সদস্যদের যে কোনও পরিবর্তনগুলি মূল এবং অনুলিপি উভয়তেই উপস্থিত হয়, যেহেতু কোনও অনুলিপি রেফারেন্সযুক্ত বস্তুর তৈরি করা হয়নি।

একটি গভীর অনুলিপিতে, মান দ্বারা সঞ্চিত ক্ষেত্রগুলি আগের মতো অনুলিপি করা হয়, তবে রেফারেন্স দ্বারা সঞ্চিত বস্তুগুলির পয়েন্টারগুলি অনুলিপি করা হয় না। পরিবর্তে, রেফারেন্স করা অবজেক্টের একটি গভীর অনুলিপি তৈরি করা হয় এবং নতুন অবজেক্টের একটি পয়েন্টার সংরক্ষণ করা হয়। এই রেফারেন্সযুক্ত অবজেক্টগুলিতে যে কোনও পরিবর্তন করা হয়েছে তা বস্তুর অন্যান্য অনুলিপিগুলিকে প্রভাবিত করবে না।


12

'শ্যালোপি' স্মৃতিতে একই জায়গায় 'উত্স' হিসাবে দেখায়। 'ডিপকপি' স্মৃতিতে পৃথক অবস্থানের দিকে নির্দেশ করে তবে বিষয়বস্তু একই are


এটি কিছুটা বিভ্রান্তিকর। অগভীর এবং গভীর উভয় অনুলিপিই বস্তুকে মেমরির একটি নতুন স্থানে অনুলিপি করবে, একটি গভীর একটি শিশু শিশুকেও অনুলিপি করবে যখন একটি অগভীর ঠিক নতুন বস্তুগুলি পুরানো বাচ্চাদের বোঝায়। মূল অবজেক্টের কথা উল্লেখ না করে পড়া মুশকিল।
বিল কে

10

অগভীর ক্লোনিং:
সংজ্ঞা: "কোনও বস্তুর অগভীর অনুলিপি 'মূল' অবজেক্টটি অনুলিপি করে, তবে অভ্যন্তরীণ বস্তুগুলি অনুলিপি করে না।" যখন কোনও কাস্টম অবজেক্ট (যেমন। কর্মচারী) এর সবেমাত্র আদিম, স্ট্রিং টাইপের ভেরিয়েবল থাকে তখন আপনি শ্যালো ক্লোনিং ব্যবহার করেন।

Employee e = new Employee(2, "john cena");
Employee e2=e.clone();

আপনি super.clone();ওভাররাইড ক্লোন () পদ্ধতিতে ফিরে আসেন এবং আপনার কাজ শেষ।

ডিপ ক্লোনিং :
সংজ্ঞা: "অগভীর অনুলিপিটির বিপরীতে একটি গভীর অনুলিপি কোনও বস্তুর সম্পূর্ণ স্বতন্ত্র অনুলিপি।"
অর্থ যখন কোনও কর্মচারী বস্তু অন্য কাস্টম অবজেক্ট ধারণ করে:

Employee e = new Employee(2, "john cena", new Address(12, "West Newbury", "Massachusetts");

তারপরে আপনাকে ওভাররাইড হওয়া ক্লোন () পদ্ধতিতে 'ঠিকানা' অবজেক্টটি ক্লোন করতে কোড লিখতে হবে। অন্যথায় ঠিকানা অবজেক্টটি ক্লোন করবে না এবং আপনি ক্লোনকৃত কর্মচারী বস্তুতে ঠিকানার মান পরিবর্তন করলে এটি বাগের কারণ হয়ে দাঁড়ায়, যা মূলটিকেও প্রতিফলিত করে।


8
var source = { firstName="Jane", lastname="Jones" };
var shallow = ShallowCopyOf(source);
var deep = DeepCopyOf(source);
source.lastName = "Smith";
WriteLine(source.lastName); // prints Smith
WriteLine(shallow.lastName); // prints Smith
WriteLine(deep.lastName); // prints Jones

এটি একটি ভাল উদাহরণ নয়। অগভীর অনুলিপিগুলি বেশিরভাগ উপাত্তগুলির অনুলিপি করার জন্য ব্যবহৃত হয়, ডেটা অনুলিপি না করেই, তবে কোনও বস্তু একবারে ভাগ করা ডেটা পরিবর্তন করার প্রয়োজন হলে এর একটি গভীর অনুলিপি নেওয়া হয়। আপনার উদাহরণটি প্রাথমিকভাবে বিভ্রান্ত করবে।
সিএমিরসিয়া

এটি কেবলমাত্র সেই ভাষাগুলিতে কাজ করে যা স্ট্রিংগুলি উপস্থাপন করতে পয়েন্টার ব্যবহার করে। ডিএইচএ যে বিন্দুটি তৈরির চেষ্টা করছে সেটি হ'ল অগভীর অনুলিপি পয়েন্টারগুলিকে অভিন্ন (একবচন) মূল বিষয়বস্তুতে অনুলিপি করে, যখন গভীর অনুলিপি পয়েন্টারগুলির রেফারেন্সযুক্ত সামগ্রীটিকে ক্লোন করে দেয়। উভয় পদ্ধতিই পৃষ্ঠের সামগ্রী অনুলিপি করে। ভাষা যদি স্ট্রিংগুলিকে পৃষ্ঠের আক্ষরিক বিষয়বস্তু হিসাবে সঞ্চয় করে, যেমন একটি ডাব্লুএভিভি শিরোনামের অভ্যন্তরে, এই উদাহরণটি কার্যকর হবে না। নোট করুন এটি সম্ভবত বেশিরভাগ বাস্তব জীবনের সমস্যার জন্য খুব পিক, যা রহস্যজনক নয়।
ড্রাগনলর্ড

8

গভীর কপি

একটি গভীর অনুলিপি সমস্ত ক্ষেত্রের অনুলিপি করে এবং ক্ষেত্রগুলি দ্বারা নির্দেশিত গতিশীলভাবে মেমরির অনুলিপি তৈরি করে। একটি গভীর অনুলিপি ঘটে যখন কোনও বস্তু যার সাথে এটি উল্লেখ করা হয় তার সাথে অনুলিপি করা হয়।

অগভীর কপি

অগভীর অনুলিপি কোনও বস্তুর বিট বুদ্ধিযুক্ত অনুলিপি। একটি নতুন অবজেক্ট তৈরি করা হয়েছে যার মূল অবজেক্টের মানগুলির একটি অনুলিপি রয়েছে। যদি অবজেক্টের কোনও ক্ষেত্র অন্য অবজেক্টের রেফারেন্স হয় তবে কেবলমাত্র রেফারেন্স ঠিকানাগুলি অনুলিপি করা হয়, কেবলমাত্র মেমরির ঠিকানাটি অনুলিপি করা হয়।


সেই লিঙ্কটি দুঃখের সাথে আর কাজ করে না - এটি এখন ওয়েব ডিজাইন সম্পর্কিত ফেব্রুয়ারী 2019 সালের একটি নিবন্ধের দিকে নির্দেশ করে (যদি না লেখক দাবিদার না হয়)?
ফিলিফিল

7

অগভীর অনুলিপি - মূল এবং অগভীর-অনুলিপি করা অবজেক্টের অভ্যন্তরে রেফারেন্স ভেরিয়েবলের মধ্যে সাধারণ বস্তুর রেফারেন্স থাকে।

গভীর অনুলিপি - মূল এবং গভীর-অনুলিপি করা বস্তুর অভ্যন্তরে রেফারেন্স ভেরিয়েবলের বিভিন্ন অবজেক্টের রেফারেন্স থাকে।

ক্লোন সর্বদা অগভীর অনুলিপি করে।

public class Language implements Cloneable{

    String name;
    public Language(String name){
        this.name=name;
    }

    public String getName() {
        return name;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

প্রধান শ্রেণি অনুসরণ করা হয়-

public static void main(String args[]) throws ClassNotFoundException, CloneNotSupportedException{

      ArrayList<Language> list=new ArrayList<Language>();
      list.add(new Language("C"));
      list.add(new Language("JAVA"));

      ArrayList<Language> shallow=(ArrayList<Language>) list.clone();
      //We used here clone since this always shallow copied.

      System.out.println(list==shallow);

      for(int i=0;i<list.size();i++)
      System.out.println(list.get(i)==shallow.get(i));//true

      ArrayList<Language> deep=new ArrayList<Language>();
      for(Language language:list){
          deep.add((Language) language.clone());
      }
      System.out.println(list==deep);
      for(int i=0;i<list.size();i++)
          System.out.println(list.get(i)==deep.get(i));//false

} 

উপরের আউটপুট হবে-

মিথ্যা সত্য সত্য

মিথ্যা মিথ্যা মিথ্যা

অরিজিনাল অবজেক্টে করা যে কোনও পরিবর্তন গভীর অবজেক্টে নয় অগভীর বস্তুতে প্রতিফলিত হবে।

  list.get(0).name="ViSuaLBaSiC";
  System.out.println(shallow.get(0).getName()+"  "+deep.get(0).getName());

আউটপুট- ViSuaLBaSiC সি


7

আমি আনুষ্ঠানিক সংজ্ঞা চেয়ে উদাহরণ দিতে চাই।

var originalObject = { 
    a : 1, 
    b : 2, 
    c : 3,
};

এই কোডটি অগভীর অনুলিপিটি দেখায় :

var copyObject1 = originalObject;

console.log(copyObject1.a);         // it will print 1 
console.log(originalObject.a);       // it will also print 1 
copyObject1.a = 4; 
console.log(copyObject1.a);           //now it will print 4 
console.log(originalObject.a);       // now it will also print 4

var copyObject2 = Object.assign({}, originalObject);

console.log(copyObject2.a);        // it will print 1 
console.log(originalObject.a);      // it will also print 1 
copyObject2.a = 4; 
console.log(copyObject2.a);        // now it will print 4 
console.log(originalObject.a);      // now it will print 1

এই কোডটি একটি গভীর অনুলিপি দেখায় :

var copyObject2 = Object.assign({}, originalObject);

console.log(copyObject2.a);        // it will print 1 
console.log(originalObject.a);      // it will also print 1 
copyObject2.a = 4; 
console.log(copyObject2.a);        // now it will print 4 
console.log(originalObject.a);      // !! now it will print 1 !!

আমি পাচ্ছি1 1 4 4 4 4 4 4
সুরেশ প্রজাপতি

গভীর অনুলিপিতে, copyObject.a = 8 করুন এবং তারপরে চেক করুন। আশা করি আপনি সঠিক উত্তর পাবেন।
বিবেক মেহতা

5
struct sample
{
    char * ptr;
}
void shallowcpy(sample & dest, sample & src)
{
    dest.ptr=src.ptr;
}
void deepcpy(sample & dest, sample & src)
{
    dest.ptr=malloc(strlen(src.ptr)+1);
    memcpy(dest.ptr,src.ptr);
}

5

সাধারণ শর্তে, একটি শ্যালো অনুলিপি কল বাই রেফারেন্সের অনুরূপ এবং একটি ডিপ কপি কল বাই মানের সাথে সমান

কল বাই রেফারেন্সে, কোনও ফাংশনের আনুষ্ঠানিক এবং আসল পরামিতি উভয়ই একই মেমরির অবস্থান এবং মানকে বোঝায়।

কল বাই ভ্যালুতে, কোনও ফাংশনের আনুষ্ঠানিক এবং আসল প্যারামিটার উভয়ই বিভিন্ন মেমরি অবস্থানকে বোঝায় তবে একই মান থাকা।


5

ভাবুন এখানে দুটি অ্যারে রয়েছে যা অ্যারি 1 এবং এ আর 2 নামে পরিচিত।

arr1 = arr2;   //shallow copy
arr1 = arr2.clone(); //deep copy

5

একটি অগভীর অনুলিপি একটি নতুন যৌগিক বস্তু তৈরি করে এবং এর মধ্যে এটির রেফারেন্সগুলি মূল অবজেক্টে sertোকায়।

অগভীর অনুলিপিটির বিপরীতে ডিপকপি নতুন যৌগিক অবজেক্ট তৈরি করে এবং মূল যৌগিক বস্তুর মূল কপিরাইটগুলি সন্নিবেশ করায়।

একটি উদাহরণ নিতে দিন।

import copy
x =[1,[2]]
y=copy.copy(x)
z= copy.deepcopy(x)
print(y is z)

উপরের কোডগুলি FALSE মুদ্রণ করে।

দেখা যাক কিভাবে।

মূল যৌগিক অবজেক্ট x=[1,[2]](যৌগ হিসাবে ডাকা হয় কারণ এটিতে বস্তুর অভ্যন্তরে অবজেক্ট থাকে (ইনসেপশন))

এখানে চিত্র বর্ণনা লিখুন

আপনি ছবিতে দেখতে পাচ্ছেন, তালিকার ভিতরে একটি তালিকা রয়েছে।

তারপরে আমরা এটি ব্যবহার করে একটি অগভীর অনুলিপি তৈরি করি y = copy.copy(x)। পাইথন এখানে যা করে তা হ'ল এটি একটি নতুন যৌগিক বস্তু তৈরি করবে তবে তাদের ভিতরে থাকা বস্তুগুলি অরিজেনাল অবজেক্টগুলিকে নির্দেশ করছে।

এখানে চিত্র বর্ণনা লিখুন

চিত্রটিতে এটি বাহ্যিক তালিকার জন্য একটি নতুন অনুলিপি তৈরি করেছে। তবে অভ্যন্তরীণ তালিকাটি মূল তালিকার মতোই রয়েছে।

এখন আমরা এটি ব্যবহার করে এর ডিপকপি তৈরি করি z = copy.deepcopy(x)। পাইথন এখানে যা করে তা হ'ল এটি বাইরের তালিকার পাশাপাশি অভ্যন্তরের তালিকার জন্য নতুন বস্তু তৈরি করবে। নীচের ছবিতে প্রদর্শিত (লাল হাইলাইটেড)

এখানে চিত্র বর্ণনা লিখুন

শেষে কোড প্রিন্টগুলি False, যেহেতু y এবং z একই জিনিস নয়।

আছে HTH।


2

অগভীর অনুলিপি একটি নতুন অবজেক্ট তৈরি করছে এবং তারপরে বর্তমান বস্তুর অ স্থিতিশীল ক্ষেত্রগুলি নতুন অবজেক্টে অনুলিপি করছে। যদি কোনও ক্ষেত্রের মান প্রকার হয় -> ক্ষেত্রের একটি বিট-বিট কপি সম্পাদন করা হয়; একটি রেফারেন্স টাইপের জন্য -> রেফারেন্সটি অনুলিপি করা হয়েছে তবে রেফারেন্স করা বস্তুটি নয়; সুতরাং আসল বস্তু এবং এর ক্লোন একই পদার্থকে বোঝায়।

ডিপ অনুলিপি একটি নতুন অবজেক্ট তৈরি করছে এবং তারপরে বর্তমান বস্তুর ননস্ট্যাটিক ক্ষেত্রগুলি নতুন অবজেক্টে অনুলিপি করছে। যদি কোনও ক্ষেত্রের মান প্রকার হয় -> ক্ষেত্রের একটি বিট-বিট কপি সঞ্চালিত হয়। যদি ক্ষেত্রটি কোনও রেফারেন্স টাইপ হয় -> রেফারেন্স করা অবজেক্টের একটি নতুন কপি করা হয়। ক্লোন করা ক্লাসগুলি অবশ্যই [সিরিয়ালাইজযোগ্য] হিসাবে পতাকাঙ্কিত করতে হবে।


2

[ব্লগ] থেকে নেওয়া: http://sickprogrammersarea.blogspot.in/2014/03/technical-interview-questions-on-c_6.html

ডিপ অনুলিপিতে একই শ্রেণীর অন্য উদাহরণ তৈরি করতে একটি বস্তুর বিষয়বস্তু ব্যবহার করে জড়িত। একটি গভীর অনুলিপিতে, দুটি বস্তুতে এইচটি তথ্য একই তথ্য থাকতে পারে তবে লক্ষ্য বস্তুর নিজস্ব বাফার এবং সংস্থান থাকবে। উভয় বস্তুর ধ্বংসটি বাকী বস্তুকে প্রভাবিত করবে না। অতিরিক্ত লোড অ্যাসাইনমেন্ট অপারেটর অবজেক্টগুলির একটি গভীর অনুলিপি তৈরি করবে।

অগভীর অনুলিপিতে একটি বস্তুর বিষয়বস্তু একই শ্রেণীর অন্য একটি দৃষ্টান্তে অনুলিপি করা যাতে মিরর ইমেজ তৈরি হয়। রেফারেন্স এবং পয়েন্টারগুলির সরাসরি অনুলিপি করার কারণে, দুটি অবজেক্ট অপ্রত্যাশিত হওয়ার জন্য অন্য অবজেক্টের একই বাহ্যিকভাবে থাকা সামগ্রীগুলি ভাগ করবে will

ব্যাখ্যা:

একটি অনুলিপি নির্মাণকারী ব্যবহার করে আমরা কেবল সদস্য দ্বারা ডেটা মানগুলির সদস্যকে অনুলিপি করি। অনুলিপি করার এই পদ্ধতিটিকে অগভীর অনুলিপি বলা হয়। যদি অবজেক্টটি একটি সাধারণ শ্রেণি হয় তবে এতে অন্তর্নির্মিত এবং কোনও পয়েন্টার সমন্বিত থাকে তবে এটি গ্রহণযোগ্য হবে। এই ফাংশনটি মানগুলি এবং অবজেক্টগুলিকে ব্যবহার করবে এবং এর আচরণটি অগভীর অনুলিপি দ্বারা পরিবর্তিত হবে না, কেবলমাত্র পয়েন্টারগুলির সদস্য যেগুলি সদস্য রয়েছে সেগুলি অনুলিপি করা হয়েছে এবং ঠিকানাটি দেখানো মানটি নয়। এরপরে অবজেক্টের ডেটা মানগুলি অজান্তে ফাংশন দ্বারা পরিবর্তিত হবে। যখন ফাংশন সুযোগের বাইরে চলে যায়, তখন তার সমস্ত ডেটা সহ অবজেক্টের অনুলিপিটি স্ট্যাকের বাইরে পপ হয়।

যদি অবজেক্টটির কোনও পয়েন্টার থাকে তবে একটি গভীর অনুলিপি কার্যকর করা দরকার। কোনও অবজেক্টের গভীর অনুলিপি সহ ফ্রি স্টোরে অবজেক্টের জন্য মেমরি বরাদ্দ করা হয় এবং নির্দেশিত উপাদানগুলি অনুলিপি করা হয়। একটি ফাংশন থেকে ফিরে আসা বস্তুর জন্য একটি গভীর অনুলিপি ব্যবহার করা হয়।


2

অন্যান্য উত্তরে আরও যুক্ত করতে,

  • কোনও বস্তুর একটি অগভীর অনুলিপি মান ভিত্তিক বৈশিষ্ট্যগুলির জন্য মান অনুসারে অনুলিপি করে এবং রেফারেন্সের ধরণের ভিত্তিক বৈশিষ্ট্যের জন্য অনুলিপি করে।
  • কোনও অবজেক্টের একটি অনুলিপি মান প্রকার ভিত্তিক বৈশিষ্ট্যগুলির সাথে মান অনুসারে অনুলিপি সম্পাদন করে, পাশাপাশি স্তরক্রমের গভীর রেফারেন্স ভিত্তিক বৈশিষ্ট্যগুলির জন্য মান দ্বারা অনুলিপি (রেফারেন্স প্রকারের)

2

অগভীর অনুলিপি নতুন রেফারেন্স তৈরি করবে না তবে গভীর অনুলিপি নতুন রেফারেন্স তৈরি করবে।

এখানে গভীর এবং অগভীর অনুলিপিটি ব্যাখ্যা করার জন্য প্রোগ্রামটি দেওয়া হচ্ছে।

public class DeepAndShollowCopy {
    int id;
    String name;
    List<String> testlist = new ArrayList<>();

    /*
    // To performing Shallow Copy 
    // Note: Here we are not creating any references. 
      public DeepAndShollowCopy(int id, String name, List<String>testlist)
       { 

       System.out.println("Shallow Copy for Object initialization");
       this.id = id; 
       this.name = name; 
       this.testlist = testlist; 

       }
    */  

    // To performing Deep Copy 
    // Note: Here we are creating one references( Al arraylist object ). 
    public DeepAndShollowCopy(int id, String name, List<String> testlist) {
        System.out.println("Deep Copy for Object initialization");
        this.id = id;
        this.name = name;
        String item;
        List<String> Al = new ArrayList<>();
        Iterator<String> itr = testlist.iterator();
        while (itr.hasNext()) {
            item = itr.next();
            Al.add(item);
        }
        this.testlist = Al;
    }


    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("Java");
        list.add("Oracle");
        list.add("C++");
        DeepAndShollowCopy copy=new DeepAndShollowCopy(10,"Testing", list);
        System.out.println(copy.toString());
    }
    @Override
    public String toString() {
        return "DeepAndShollowCopy [id=" + id + ", name=" + name + ", testlist=" + testlist + "]";
    }
}

1

আর্যগুলি অনুলিপি করা হচ্ছে:

অ্যারে একটি শ্রেণি, যার অর্থ এটি রেফারেন্স টাইপ হয় তাই অ্যারে 1 = অ্যারে 2 ফলাফল দুটি ভেরিয়েবলের ক্ষেত্রে একই অ্যারে রেফারেন্স করে।

তবে এই উদাহরণটি দেখুন:

  static void Main()
    {
        int[] arr1 = new int[] { 1, 2, 3, 4, 5 }; 
        int[] arr2 = new int[] { 6, 7, 8, 9, 0 };

        Console.WriteLine(arr1[2] + " " + arr2[2]);
        arr2 = arr1;
        Console.WriteLine(arr1[2] + " " + arr2[2]); 
        arr2 = (int[])arr1.Clone();
        arr1[2] = 12;
        Console.WriteLine(arr1[2] + " " + arr2[2]);
    }

অগভীর ক্লোনটির অর্থ ক্লোনযুক্ত অ্যারে দ্বারা প্রতিনিধিত্ব করা কেবল মেমরির অনুলিপি করা হয়।

অ্যারেতে যদি মান ধরণের অবজেক্ট থাকে তবে মানগুলি অনুলিপি করা হয় ;

অ্যারেটিতে যদি রেফারেন্সের ধরণ থাকে তবে কেবলমাত্র রেফারেন্সগুলি অনুলিপি করা হয় - ফলস্বরূপ দুটি অ্যারে রয়েছে যার সদস্যরা একই বস্তুটিকে রেফারেন্স করে

একটি গভীর অনুলিপি তৈরি করতে - যেখানে রেফারেন্সের ধরণটি নকল করা আছে, আপনাকে অবশ্যই অ্যারের মধ্য দিয়ে লুপ করতে হবে এবং প্রতিটি উপাদানটিকে ম্যানুয়ালি ক্লোন করতে হবে।


আমি অন্যান্য ভাষা সম্পর্কে জানি না, তবে সি # / ভিবিতে অগভীর মান ধরণের অ্যারে অনুলিপি করে মানগুলি অনুলিপি করে না । দুটি অ্যারে একই জিনিসকে বোঝায়। কোনও ফর্মটিতে একটি বোতাম যুক্ত করুন এবং এই কোডটি যুক্ত করুন:private void button1_Click(object sender, EventArgs e) { int[] arr1 = new int[]{1,2,3,4,5}; int[] arr2 = new int[]{6,7,8,9,0}; MessageBox.Show(arr1[2] + " " + arr2[2]); arr2 = arr1; MessageBox.Show(arr1[2] + " " + arr2[2]); arr1[2] = 12; MessageBox.Show(arr1[2] + " " + arr2[2]); }
ডিনোক

আপনি ঠিক বলেছেন, অ্যারেতে ক্লোন ব্যবহার করে আমি আমার উত্তরটি আরও সুনির্দিষ্ট হওয়ার জন্য সংশোধন করেছি। আপনি একদম ঠিক বলেছেন যে "অল্প অল্প অল্প মূল্যরূপের অ্যারে অনুলিপি করে মানগুলি অনুলিপি করে না", তবে অ্যারেতে ক্লোন ব্যবহার করে। আমি এটি ব্যাখ্যা করার চেষ্টা করেছি, চেষ্টা করে দেখি। ধন্যবাদ
লুকাশজ্ক

1

আমি নিম্নলিখিত লাইন থেকে বুঝতে পেরেছি।

অগভীর অনুলিপি অবজেক্টের লক্ষ্যবস্তু করার জন্য কোনও অবজেক্ট মানের ধরণের (ইন্টি, ফ্লোট, বুল) ক্ষেত্রগুলি অনুলিপি করে এবং অবজেক্টের রেফারেন্স প্রকারগুলি (স্ট্রিং, বর্গ ইত্যাদি) টার্গেট অবজেক্টে রেফারেন্স হিসাবে অনুলিপি করা হয় । এই টার্গেটে রেফারেন্সের প্রকারগুলি উত্স অবজেক্টের মেমরির অবস্থানটির দিকে নির্দেশ করবে।

গভীর অনুলিপি কোনও অবজেক্টের মান এবং রেফারেন্সের ধরণের লক্ষ্যবস্তুগুলির সম্পূর্ণ নতুন অনুলিপিতে অনুলিপি করে। এর অর্থ মান প্রকার এবং রেফারেন্স উভয়ই একটি নতুন মেমরি অবস্থান বরাদ্দ করা হবে।


0

উপরের সমস্ত সংজ্ঞায় যুক্ত করা, আরও একটি এবং সর্বাধিক ব্যবহৃত গভীর অনুলিপি, ক্লাসের অনুলিপি কন্সট্রাক্টর (বা ওভারলোডিং অ্যাসাইনমেন্ট অপারেটর) এ।

অগভীর অনুলিপি -> হল যখন আপনি অনুলিপি নির্মাণকারী সরবরাহ করছেন না। এখানে কেবলমাত্র বস্তু অনুলিপি করা হয় তবে শ্রেণির সমস্ত সদস্য অনুলিপি করেন না।

গভীর অনুলিপি -> হ'ল আপনি যখন নিজের ক্লাসে অনুলিপি নির্মাণকারী বা ওভারলোড অ্যাসাইনমেন্টটি প্রয়োগ করার সিদ্ধান্ত নিয়েছেন এবং ক্লাসের সমস্ত সদস্যদের অনুলিপি করার অনুমতি দেন।

MyClass& MyClass(const MyClass& obj) // copy constructor for MyClass
{
          // write your code, to copy all the members and return the new object
}
MyClass& operator=(const MyClass& obj) // overloading assignment operator,
{
          // write your code, to copy all the members and return the new object
}

0

অনুলিপি নির্মাণকারী একই বর্গের পূর্বে নির্মিত বস্তুর সাথে নতুন অবজেক্টটি আরম্ভ করার জন্য ব্যবহৃত হয়। ডিফল্ট সংকলক একটি অগভীর অনুলিপি লিখেছিলেন। গতিশীল মেমরি বরাদ্দ জড়িত না হলে অগভীর অনুলিপি সূক্ষ্মভাবে কাজ করে কারণ যখন গতিশীল মেমরি বরাদ্দ জড়িত থাকে তখন উভয় বস্তু একটি স্তূপে একই মেমরি অবস্থানের দিকে নির্দেশ করবে, সুতরাং এই সমস্যাটি সরাতে আমরা গভীর অনুলিপিটি লিখেছি যাতে উভয় বস্তুর নিজস্ব বৈশিষ্ট্যগুলির অনুলিপি থাকে একটি স্মৃতিতে। সম্পূর্ণ উদাহরণ এবং ব্যাখ্যা সহ বিশদটি পড়তে আপনি নিবন্ধটি দেখতে পারবেন C ++ নির্মাণকারী

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.