কপিরাইট অন লিখিত শব্দার্থবিজ্ঞানের গুণাবলী


10

আমি ভাবছি যে অনুলিপি অনুলিপি কি সম্ভব মেধা আছে? স্বাভাবিকভাবেই, আমি ব্যক্তিগত মতামত প্রত্যাশা করি না, তবে বাস্তব-বিশ্বের ব্যবহারিক পরিস্থিতি যেখানে এটি একটি বাস্তব উপায়ে প্রযুক্তিগত এবং ব্যবহারিকভাবে উপকারী হতে পারে। এবং স্পষ্টতই আমি আপনাকে একটি &চরিত্রের টাইপিং সংরক্ষণের চেয়ে আরও কিছু বোঝাতে চাইছি ।

স্পষ্ট করার জন্য, এই প্রশ্নটি ডেটাটাইপসের প্রসঙ্গে, যেখানে অ্যাসাইনমেন্ট বা অনুলিপি নির্মাণ একটি অন্তর্নিহিত অগভীর অনুলিপি তৈরি করে, তবে এতে পরিবর্তনগুলি একটি অন্তর্নিহিত গভীর অনুলিপি তৈরি করে এবং মূল বস্তুর পরিবর্তে এতে পরিবর্তনগুলি প্রয়োগ করে।

আমি জিজ্ঞাসা করার কারণটি হ'ল আমি ডিফল্ট অন্তর্নিহিত আচরণ হিসাবে COW থাকার কোনও গুণ খুঁজে পাচ্ছি না। আমি কিউটি ব্যবহার করি, যা প্রচুর ডেটাটাইপগুলির জন্য COW বাস্তবায়িত করেছে, প্রায়োগিকভাবে যা কিছু অন্তর্নিহিত গতিশীল বরাদ্দকৃত সঞ্চয়স্থান রয়েছে all তবে কীভাবে এটি ব্যবহারকারীর উপকারে আসে?

একটি উদাহরণ:

QString s("some text");
QString s1 = s; // now both s and s1 internally use the same resource

qDebug() << s1; // const operation, nothing changes
s1[o] = z; // s1 "detaches" from s, allocates new storage and modifies first character
           // s is still "some text"

এই উদাহরণে COW ব্যবহার করে আমরা কী জিততে পারি?

তাহলে আমরা কি সব মনস্থ করা ব্যবহার const অপারেশন হয়, s1অপ্রয়োজনীয়, ভাল ব্যবহার পারে s

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

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

সুতরাং আপনি COW সম্পর্কে জানেন বা এটি সম্পর্কে অবহেলিত কিনা তার উপর নির্ভর করে এটি হয় অস্পষ্ট অভিপ্রায় এবং অপ্রয়োজনীয় ওভারহেডের কোডের ফলে বা সম্পূর্ণ বিভ্রান্তিকর আচরণের ফলে প্রত্যাশাগুলির সাথে মেলে না এবং আপনার মাথা চুলকায় leaves

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

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

উত্তর:


15

লেখার অনুলিপি এমন পরিস্থিতিতে ব্যবহার করা হয় যেখানে আপনি প্রায়শই অবজেক্টের একটি অনুলিপি তৈরি করে তা পরিবর্তন করেন না। এই পরিস্থিতিতে, এটি নিজের জন্য অর্থ প্রদান করে।

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

সি +11 এর নতুন নিয়মগুলি std::stringবিশেষত COW নিষেধ করে। যদি ব্যাকিং বাফারটি আলাদা করা হয় তবে স্ট্রিংয়ের আইট্রেটারগুলিকে অবৈধ করতে হবে। যদি পুনরুক্তিকরণকারীটিকে char*(যেমন string*এবং একটি সূচকের বিপরীতে ) হিসাবে প্রয়োগ করা হচ্ছে তবে এই পুনরাবৃত্তিগুলি আর বৈধ নয়। সি ++ সম্প্রদায়কে সিদ্ধান্ত নিতে হয়েছিল যে কত ঘন ঘন পুনরাবৃত্তিকারীদের অবৈধ করা যায়, এবং সিদ্ধান্তটি operator[]এই ক্ষেত্রেগুলির মধ্যে একটি হওয়া উচিত নয়। operator[]একটি std::stringরিটার্নে একটি char&, যা পরিবর্তিত হতে পারে। সুতরাং, operator[]স্ট্রিং বিচ্ছিন্ন করা আবশ্যক পুনরুক্তি করা প্রয়োজন। এটি একটি দুর্বল বাণিজ্য বলে মনে করা হয়েছিল, এবং এর মতো ফাংশনগুলির মতো নয় end()এবং স্ট্রিং castালাইয়ের সংক্ষিপ্ত cend()রূপটির কনস্টের সংস্করণটি জিজ্ঞাসার কোনও উপায় নেই operator[]। ( সম্পর্কিত )

COW এখনও জীবিত এবং এসটিএল এর বাইরে ভাল। বিশেষত, আমার APIs ব্যবহারকারীর পক্ষে এমনটি আশা করা যে এটি খুব হালকা বস্তু বলে মনে হচ্ছে তার পিছনে কিছু হেভিওয়েট অবজেক্ট রয়েছে এমন ক্ষেত্রে এটি অযৌক্তিক বলে মনে হয়েছে। আমি কখনই এ জাতীয় বাস্তবায়নের বিশদ নিয়ে তাদের উদ্বিগ্ন হতে হবে না তা নিশ্চিত করতে পটভূমিতে COW ব্যবহার করতে চাই।


একাধিক থ্রেডে একই স্ট্রিংকে একত্রে পরিণত করা খুব খারাপ ডিজাইনের মতো মনে হয়, আপনি পুনরুক্তি ব্যবহারকারী বা []অপারেটর ব্যবহার না করেই । সুতরাং COW খারাপ নকশা সক্ষম করে - এটি কোনও উপকারের মতো শোনাচ্ছে না :) শেষ অনুচ্ছেদে বিন্দুটি বৈধ বলে মনে হচ্ছে, তবে আমি নিজেও অন্তর্নিহিত আচরণের খুব ভাল অনুরাগী নই - লোকেরা এটি মঞ্জুর করার ঝোঁক নেয়, এবং তারপরেও কোড কেন আশানুরূপ কাজ করে না তা নির্ণয় করা এবং এই অন্তর্নিহিত আচরণের পিছনে কী লুকানো আছে তা পরীক্ষা না করা পর্যন্ত তারা অবাক হয়ে ভাবছেন।
dtech

ব্যবহারের বিষয় হিসাবে const_castমনে হয় এটি COW যেমন সহজেই ভেঙে ফেলতে পারে ঠিক তত সহজেই এটি কনফারেন্স রেফারেন্স দিয়ে পাসিং ভেঙে ফেলতে পারে। উদাহরণস্বরূপ, QString::constData()একটি প্রদান করে const QChar *- const_castএটি এবং সিওডাব্লু ভেঙে যায় - আপনি আসল অবজেক্টের ডেটা পরিবর্তন করতে পারবেন।
dtech

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

আমি বিশ্বাস করি যে stringক্লাসগুলি COW আচরণ পেয়েছিল কারণ সংকলক ডিজাইনাররা লক্ষ্য করেছেন যে কোডের একটি বৃহত অংশটি কনস্ট-রেফারেন্স ব্যবহার না করে স্ট্রিংগুলি অনুলিপি করছে। যদি তারা COW যুক্ত করে, তারা এই কেসটিকে অনুকূল করতে পারে এবং আরও বেশি লোককে খুশি করতে পারে (এবং এটি সি ++ 11 অবধি আইনী ছিল)। আমি তাদের অবস্থানের প্রশংসা করি: যদিও আমি সর্বদা আমার রেখাচিত্রমালা রেফারেন্সের মাধ্যমে আমার স্ট্রিংগুলি পাস করি, আমি সেই সমস্ত সিনট্যাকটিক জাঙ্ক দেখেছি যা কেবল পঠনযোগ্যতা থেকে বিরত থাকে। আমি const std::shared_ptr<const std::string>&কেবল সঠিক শব্দার্থবিজ্ঞান ক্যাপচার লিখতে ঘৃণা করি !
কর্ন অ্যাম্মন

5

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

তবে আপনার যদি অ্যান্ড্রয়েডের মতো একটি শক্তিশালী অবজেক্ট থাকে এবং আপনি এটি অনুলিপি করতে এবং কেবল তার সাইবারনেটিক বাহুটি প্রতিস্থাপন করতে চেয়েছিলেন তবে পুরো অ্যান্ড্রয়েডকে কেবল অনুলিপি করার প্রয়োজনীয়তা এড়াতে পার্শ্ব পরিবর্তনযোগ্য সিনট্যাক্স রাখার উপায় হিসাবে CO যথেষ্ট যুক্তিযুক্ত বলে মনে হচ্ছে অনুলিপিটি একটি অনন্য হাত দিন। এ মুহুর্তে অবিচ্ছিন্ন ডাটা স্ট্রাকচার হিসাবে এটিকে কেবল অপরিবর্তনীয় করে তোলা উন্নততর হতে পারে তবে স্বতন্ত্র অ্যান্ড্রয়েড অংশগুলিতে প্রয়োগ করা "আংশিক COW" এই ক্ষেত্রে যুক্তিযুক্ত বলে মনে হয়।

এ জাতীয় ক্ষেত্রে অ্যান্ড্রয়েডের দুটি অনুলিপি একই ধড়, পা, পা, মাথা, ঘাড়ে, কাঁধ, পেলভি ইত্যাদি ভাগ করে / ভাগ করবে etc. একমাত্র তথ্য যা তাদের মধ্যে আলাদা হবে এবং ভাগ না করা হবে তা হ'ল হাতটি যা তৈরি হয়েছিল এর বাহু ওভাররাইটিংয়ে দ্বিতীয় অ্যান্ড্রয়েডের জন্য অনন্য।


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

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

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

@ ডিড্রাইভার আমাদের যা আছে তা নোডাল দৃষ্টান্তের সাথে একটি প্রোগ্রামিং ভাষার সাথে সাদৃশ্যযুক্ত, সরলতার ব্যতীত নোড জাতীয় ধরণের ব্যবহারের মূল্য শব্দার্থক এবং কোনও রেফারেন্স-টাইপ শব্দার্থবিজ্ঞান (সম্ভবত কিছুটা আমাদের std::vector<std::string>আগে emplace_backসি ++ তে শব্দার্থক পদক্ষেপ নেওয়ার আগে ) । তবে আমরা মূলত ইনস্ট্যান্সিংও ব্যবহার করছি। নোড সিস্টেম ডেটা পরিবর্তন করতে পারে বা নাও করতে পারে। আমাদের কাছে পাস-থ্রো নোডের মতো জিনিস রয়েছে যা ইনপুট দিয়ে কিছুই করে না তবে কেবল একটি অনুলিপি দেয় (তারা তার প্রোগ্রামটির ব্যবহারকারী সংস্থার জন্য রয়েছে)। এই ক্ষেত্রে, সমস্ত তথ্য জটিল ধরণের জন্য অগভীর অনুলিপি করা হয় ...

@ ডিড্রাইভার আমাদের অনুলিপি অনুলিপি কার্যকরভাবে "পরিবর্তনের উপর অনন্যভাবে তৈরি করুন" ধরণের অনুলিপি প্রক্রিয়া। এটি মূলটি সংশোধন করা অসম্ভব করে তোলে। যদি অবজেক্টটি Aঅনুলিপি করা হয় এবং এতে আপত্তি জানার জন্য কিছুই করা হয় না B, তবে এটি মেসের মতো জটিল ডেটা ধরণের জন্য একটি অগভীর অনুলিপি। এখন যদি আমরা সংশোধন করি তবে Bযে ডেটা আমরা সংশোধন করি তা Bসিওডাব্লু এর মাধ্যমে অনন্য হয়ে ওঠে, তবে Aঅচ্ছুত হয় (কিছু পারমাণবিক রেফারেন্স গণনা বাদে)।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.