basic_string
সি ++ 11 এবং তারপরে COW নিষিদ্ধ?
সংক্রান্ত
” আমি কি ঠিক করছি যে সি ++ 11 এর COW ভিত্তিক বাস্তবায়ন স্বীকার করে না std::string
?
হ্যাঁ.
সংক্রান্ত
” যদি তা হয় তবে এই সীমাবদ্ধতাটি নতুন মান (কোথায়) কোথাও স্পষ্টভাবে বলা হয়েছে?
প্রায় প্রত্যক্ষভাবে, বেশ কয়েকটি ক্রিয়াকলাপের জন্য ধ্রুবক জটিলতার প্রয়োজনীয়তার জন্য যাকোনও COW বাস্তবায়নে স্ট্রিং ডেটার শারীরিক অনুলিপিকরতে প্রয়োজন ( N )।
উদাহরণস্বরূপ, সদস্য ফাংশনগুলির জন্য
auto operator[](size_type pos) const -> const_reference;
auto operator[](size_type pos) -> reference;
… যা একটি COW বাস্তবায়নে - স্ট্রিংয়ের মানটি ভাগ করে নেওয়ার জন্য স্ট্রিং ডেটা অনুলিপি করতে পারে, সি ++ 11 স্ট্যান্ডার্ডের প্রয়োজন
সি ++ 11 §21.4.5 / 4 :
” জটিলতা: ধ্রুবক সময়।
… যা এই জাতীয় ডেটা অনুলিপি করার বিষয়টি বাতিল করে এবং তাই, COW।
সি ++ 03 দ্বারা সমর্থিত কাউ বাস্তবায়নের না এই ধ্রুবক জটিলতা প্রয়োজনীয়তা না থাকার, এবং, নির্দিষ্ট নিয়ন্ত্রণমূলক অবস্থার অধীনে, এর কল, যার ফলে operator[]()
, at()
, begin()
, rbegin()
, end()
, অথবা rend()
বাতিল উল্লেখ পয়েন্টার এবং iterators STRING টি আইটেম উল্লেখ অর্থাৎ সম্ভবত বহন করতে একটি COW ডেটা অনুলিপি করা হচ্ছে। এই সমর্থনটি সি ++ 11 এ সরানো হয়েছে।
সি + ডাব্লু কি সি ++ 11 অবৈধ নিয়মের মাধ্যমেও নিষিদ্ধ?
আর একটি উত্তরে যা লেখার সময় সমাধান হিসাবে নির্বাচিত হয়, এবং যা ভারীভাবে উপবিষ্টিত হয় এবং তাই আপাতভাবে বিশ্বাস করা হয়, এটি দৃ that়ভাবে জানায় যে
" একটি COW স্ট্রিংয়ের জন্য, অ-কল করার জন্য const
operator[]
একটি অনুলিপি তৈরি করতে হবে (এবং রেফারেন্সকে অবৈধ করা), যা উপরের [উদ্ধৃত] অনুচ্ছেদে [সি ++ 11 §21.4.1 / 6] দ্বারা অনুমোদিত নয়। সুতরাং, সি ++ 11 এ কোনও COW স্ট্রিং থাকা বৈধ নয়।
এই দাবী দুটি প্রধান উপায়ে ভুল এবং বিভ্রান্তিকর:
- এটি ভুলভাবে নির্দেশ করে যে কেবল অ-
const
আইটেম অ্যাকসেসরগুলিতে একটি COW ডেটা অনুলিপি করা দরকার।
তবে const
আইটেম অ্যাক্সেসকারীদেরও ডেটা অনুলিপি তৈরি করতে হবে, কারণ তারা ক্লায়েন্ট কোডকে রেফারেন্স বা পয়েন্টার গঠনের অনুমতি দেয় যে (সি ++ 11 এ) পরে সেই অপারেশনগুলির মাধ্যমে পরে অকার্যকর হওয়ার অনুমতি নেই যা COW ডেটা অনুলিপি তৈরি করতে পারে।
- এটি ভুলভাবে ধরে নিয়েছে যে COW ডেটা অনুলিপি করার কারণে রেফারেন্স অবৈধ হতে পারে।
তবে একটি সঠিক বাস্তবায়নে COW ডেটা অনুলিপি করা, স্ট্রিংয়ের মানটি ভাগ করে নেওয়া, এমন কোনও রেফারেন্স যা অবৈধ হতে পারে তার আগে একটি পর্যায়ে সম্পন্ন করা হয়।
কীভাবে একটি সঠিক সি ++ 11 COW বাস্তবায়ন basic_string
কাজ করবে তা দেখার জন্য, যখন এই (O) 1 টি প্রয়োজনীয়তাগুলি এটি অবৈধ করে তোলে, তখন এমন একটি বাস্তবায়নের কথা চিন্তা করুন যেখানে স্ট্রিং মালিকানা নীতিগুলির মধ্যে পরিবর্তন করতে পারে। একটি স্ট্রিং উদাহরণ পলিসি শেয়ারে শুরু হয়। এই নীতি সক্রিয় সঙ্গে কোনও বাহ্যিক আইটেম রেফারেন্স থাকতে পারে। উদাহরণটি অনন্য নীতিতে রূপান্তর করতে পারে এবং কোনও আইটেম রেফারেন্স সম্ভাব্যরূপে কল হিসাবে যেমন তৈরি হয় .c_str()
(অন্তত যদি এটি অভ্যন্তরীণ বাফারটিতে একটি পয়েন্টার তৈরি করে) তখন এটি অবশ্যই করতে হবে । একাধিক উদাহরণের মানটির মালিকানা ভাগ করে নেওয়ার ক্ষেত্রে এটি স্ট্রিং ডেটা অনুলিপি করে। অনন্য নীতিতে স্থানান্তরিত হওয়ার পরে উদাহরণটি কেবলমাত্র এমন কোনও ক্রিয়াকলাপের মাধ্যমে শেরে ফিরে যেতে পারে যা অ্যাসাইনমেন্টের মতো সমস্ত রেফারেন্সকে অকার্যকর করে দেয়।
সুতরাং, যখন উত্তরটির উপসংহারটি, COW স্ট্রিংগুলিকে বাতিল করা হয়েছে, সঠিক, প্রস্তাবিত যুক্তিটি ভুল এবং দৃ strongly়ভাবে বিভ্রান্তিকর।
আমি সন্দেহ করি যে এই ভুল বোঝাবুঝির কারণটি সি ++ 11 এর এনেক্সেক্স সি-তে একটি নন-আদর্শিক নোট:
সি ++ 11 §C.2.11 [বিভক্ত।
পরিবর্তন : basic_string
প্রয়োজনীয়তা আর রেফারেন্স গণনা করা স্ট্রিং অনুমতি দেয় না যুক্তি
: রেফারেন্স গণনা করা স্ট্রিং সঙ্গে অবৈধতা সূক্ষ্মভাবে পৃথক। এই পরিবর্তনটি এই আন্তর্জাতিক মানের জন্য আচরণ (sic) নিয়মিত করে।
মূল বৈশিষ্ট্যের উপর প্রভাব: বৈধ সি ++ 2003 কোডটি এই আন্তর্জাতিক স্ট্যান্ডার্ডে ভিন্নভাবে কার্যকর করতে পারে
এখানে যুক্তিটি প্রাথমিকভাবে ব্যাখ্যা করে যে কেন কেউ সি ++ 03 বিশেষ COW সমর্থন অপসারণের সিদ্ধান্ত নিয়েছে। এই যুক্তি, কেন , মানটি কীভাবে কার্যকরভাবে COW বাস্তবায়নকে অস্বীকার করে না। স্ট্যান্ডার্ডটি O (1) প্রয়োজনীয়তার মাধ্যমে COW অস্বীকার করে।
সংক্ষেপে, সি ++ 11 অবৈধকরণের নিয়মগুলি কোনও COW বাস্তবায়নকে অস্বীকার করে না std::basic_string
। তবে তারা কমপক্ষে জি ++ এর স্ট্যান্ডার্ড লাইব্রেরি বাস্তবায়নের মতো একটি যুক্তিসঙ্গতভাবে দক্ষ সীমাহীন সি ++ 03-স্টাইলের COW বাস্তবায়নকে বাতিল করে দেয়। বিশেষ C ++ 03 COW সমর্থন ব্যবহারিক দক্ষতার অনুমতি দিয়েছে, বিশেষত const
আইটেম অ্যাকসেসরগুলি ব্যবহার করে, অবৈধকরণের জন্য সূক্ষ্ম, জটিল নিয়মের ব্যয়:
সি ++ 03 §21.3 / 5 এর মধ্যে "প্রথম কল" COW সমর্থন অন্তর্ভুক্ত:
"basic_string
অনুক্রমের উপাদানগুলির সাথে উল্লেখ করে রেফারেন্স, পয়েন্টার এবং পুনরাবৃত্তকারীগুলি সেই basic_string
বস্তুর নিম্নলিখিত ব্যবহারগুলি দ্বারা অবৈধ হতে পারে :
- swap()
সদস্যবিহীন ফাংশনগুলির (21.3.7.8), operator>>()
(21.3.7.9) এবং getline()
(21.3 ) হিসাবে একটি যুক্তি হিসাবে । 7.9)।
- একটি তর্ক হিসাবে basic_string::swap()
।
- কলিং data()
এবং c_str()
সদস্য ফাংশন।
- অ কলিং const
সদস্য ফাংশন, ব্যতীত operator[]()
, at()
, begin()
, rbegin()
, end()
, এবং rend()
।
- ফরম ছাড়া উপরে ব্যবহার সম্পর্কে কোন পরবর্তী insert()
এবং erase()
যা আসতে iterators, অ- প্রথম কল const
সদস্য ফাংশন operator[]()
, at()
, begin()
, rbegin()
,end()
, বা rend()
।
এই নিয়মগুলি এত জটিল এবং সূক্ষ্ম যে আমি অনেক প্রোগ্রামারকে সন্দেহ করি, যদি কোনও হয় তবে একটি যথার্থ সংক্ষিপ্তসার দিতে পারে। আমি পারিনি.
যদি ও (1) প্রয়োজনীয়তা অবজ্ঞা করা হয় তবে কী হবে?
যদি উদাহরণস্বরূপ সি ++ 11 ধ্রুবক সময়ের প্রয়োজনীয়তাগুলি operator[]
উপেক্ষা করা হয়, তবে এর জন্য COW basic_string
প্রযুক্তিগতভাবে সম্ভব, তবে কার্যকর করা কঠিন।
অপারেশনগুলি যা COW ডেটা অনুলিপি ব্যতীত কোনও স্ট্রিংয়ের বিষয়বস্তু অ্যাক্সেস করতে পারে তার মধ্যে রয়েছে:
- মাধ্যমে কনকনাটেশন
+
।
- মাধ্যমে আউটপুট
<<
।
basic_string
স্ট্যান্ডার্ড লাইব্রেরি ফাংশনগুলির পক্ষে যুক্তি হিসাবে ব্যবহার করা ।
আধুনিক কারণ গ্রন্থাগারটি নির্দিষ্ট জ্ঞান এবং নির্মাণের উপর নির্ভর করার অনুমতিপ্রাপ্ত ly
অতিরিক্তভাবে একটি বাস্তবায়ন COW ডেটা অনুলিপকে ট্রিগার না করে স্ট্রিং সামগ্রীগুলিতে অ্যাক্সেসের জন্য বিভিন্ন অ-মানক ফাংশন সরবরাহ করতে পারে।
একটি প্রধান জটিল কারণটি হ'ল সি ++ এ basic_string
আইটেমের অ্যাক্সেস অবশ্যই ডেটা অনুলিপি করতে হবে (স্ট্রিং ডেটা ভাগ করে নেবে না) তবে নিক্ষেপ করতে হবে না , যেমন সি ++ 11 §21.4.5 / 3 " নিক্ষেপ : কিছুই নয়"। এবং তাই এটি COW ডেটা অনুলিপি করার জন্য একটি নতুন বাফার তৈরি করতে সাধারণ গতিশীল বরাদ্দ ব্যবহার করতে পারে না। এই সমস্যা এড়ানোর ওয়ান ওয়ে একটি বিশেষ গাদা যেখানে মেমরি যাবে ব্যবহার করা সংরক্ষিত আসলে বরাদ্দ হচ্ছে না, এবং তারপর স্ট্রিং মান প্রতিটি যৌক্তিক রেফারেন্সের জন্য প্রয়োজনীয় পরিমাণ রাখি। এ জাতীয় স্তূপে সংরক্ষণ এবং সংরক্ষণের ব্যবস্থা অবিচ্ছিন্ন সময় হতে পারে, হে (1), এবং যে পরিমাণ ইতিমধ্যে সংরক্ষণ করা হয়েছে তা বরাদ্দ করা যেতে পারেnoexcept
। স্ট্যান্ডার্ডের প্রয়োজনীয়তাগুলি মেনে চলার জন্য, এই পদ্ধতির সাথে দেখে মনে হয় স্বতন্ত্র বরাদ্দকারীদের জন্য এই জাতীয় বিশেষ সংরক্ষণের ভিত্তিতে একটি গাদা থাকা দরকার।
দ্রষ্টব্য:
¹ const
আইটেমটি ট্রিগার অ্যাকসেসর অনুলিপি একটি গাভী ডেটা কারণ এটি ক্লায়েন্ট কোড ডেটা, যার ফলে এটি পরবর্তী তথ্য দ্বারা বাতিল করার অনুমতি না যেমন অ দ্বারা আলোড়ন সৃষ্টি অনুলিপি করা একটি রেফারেন্স বা পয়েন্টার প্রাপ্ত করা সম্ভব const
আইটেমটি অ্যাকসেসর।