এসটিডি :: ডিনারারে বনাম স্টেড :: ভেক্টর


84

সি ++ 14 উপহার std::dynarray:

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

std::dynarrayরানটাইম হিসাবে একই হিসাবে বরাদ্দ করা আবশ্যক std::vector

সুতরাং বেনিফিট এবং ব্যবহার কি std::dynarrayআমরা ব্যবহার করতে পারি যখন std::vectorযা আরো গতিশীল (পুনরায়- বৃহদাকার এবং) কীভাবে?


4
আরে, কখন থেকে "সি ++ 14" ট্যাগ হয়? আমি অন্য দিনটি সন্ধান করছিলাম এবং এটির অস্তিত্ব নেই ...
কেরেরেক এসবি

4
হয় std::valarrayনতুন নামকরণ std::dynarray? std::dynarrayএটিকে আবার আকার দিতে না পারলে কী গতিশীল ?
ইয়াসউসার

9
@ আয়সোসার, না, এটির কিছুই করার নেই valarray। এটি গতিশীল কারণ অ্যারের দৈর্ঘ্য একটি রান-টাইম মান, এটি সংকলন সময়ে জানা দরকার নেই, বিপরীতেstd::array
জোনাথন ওয়েকেলি

21
নোট করুন যে গত সপ্তাহে সি ++ স্ট্যান্ডার্ড কমিটির বৈঠকে, dynarrayসি ++ 14 থেকে সরানো হয়েছিল এবং ভবিষ্যতের প্রযুক্তিগত নির্দিষ্টকরণ (এটি টিআর 1 এর একটি নতুন সংস্করণ হিসাবে ভাবেন) হিসাবে অন্তর্ভুক্ত করা হয়েছে কারণ এতে কিছু গুরুতর প্রযুক্তিগত সমস্যা রয়েছে।
পিট বেকার 10

4
ড্যানারারে আর খসড়া সি ++ 14 এর অংশ নয়
ক্যাসিনাজ

উত্তর:


90

সুতরাং সুবিধা এবং এর ব্যবহারগুলি কী কী std::dynarray, যখন আমরা ব্যবহার করতে পারি std::vectorযা আরও গতিশীল (পুনরায় আকার ধারণযোগ্য)?

dynarrayএর চেয়ে ছোট এবং সরল vector, কারণ এটির জন্য পৃথক আকার এবং ক্ষমতা মানগুলি পরিচালনা করার দরকার নেই এবং এটির জন্য বরাদ্দকারীকে সঞ্চয় করার দরকার নেই।

তবে মূল কার্যকারিতা বেনিফিটটি এই বাস্তবতা থেকে আসে যে বাস্তবায়নগুলি dynarrayযখন সম্ভব তখন স্ট্যাকের জন্য বরাদ্দ করতে উত্সাহিত করা হয় , কোনও গাদা বরাদ্দ এড়ানো হয়। যেমন

std::dynarray<int> d(5);   // can use stack memory for elements
auto p = new std::dynarray<int>(6);  // must use heap memory for elements

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


4
দুর্দান্ত, আমি ভাবছিলাম যে বন্যের মধ্যে কোনও তুচ্ছ-বাস্তব পরিকল্পনা রয়েছে dynarrayকিনা। আমি সর্বদা ভেবেছিলাম যে কোনও কিছু মানসম্পন্ন করার যোগ্য হওয়ার আগে আপনার বিদ্যমান অনুশীলনের দুটি স্বতন্ত্র বাস্তবায়ন প্রয়োজন।
কেরেক এসবি

না, স্ট্যাক-বরাদ্দের কোনও ज्ञात বাস্তবায়ন নেই dynarray। যদিও বাস্তবায়ন অভিজ্ঞতা খুব দরকারী, এটির জন্য প্রয়োজনীয় কোনও নির্ধারিত নিয়ম নেই (তবে কেউ কেউ বলবেন এটি হওয়া উচিত!)
জোনাথন ওয়েকেলি

এখানে শুধু মস্তিষ্কে উত্তোলন তবে 2 টি ফাংশন তৈরি সম্পর্কে কী বলা যায়: এসটিডি :: ডিনাররে মেক_ডেন_আউটোস্টোজারিজ (ইন্টি) এবং স্টাড :: ডিনাররে মেক_ডেন_হেপ (ইনট)?
লরিজসেনকে

4
@ কেরেকএসবি, হ্যাঁ, শিকাগোর লাইব্রেরি গতি 10 ছিল: "আমরা পরিকল্পিত অ্যারে এক্সটেনশানস টিএসের জন্য একটি ওয়ার্কিং পেপার তৈরি করান, সি ++ 14 সিডিতে প্রয়োগ করা সম্পাদনাগুলি দুটি কাগজ N3639 দ্বারা সরান ," স্বয়ংক্রিয়ভাবে রানটাইম-আকারের অ্যারেগুলি স্টোরেজ সময়কাল (পুনর্বিবেচনা 5) " এন 3662 ," সি ++ ডায়নামিক অ্যারে (ডায়নারি) "এবং অ্যারে এক্সটেনশানস টিএস প্রকল্প সম্পাদককে আরে এক্সটেনশনগুলি ওয়ার্কিং পেপারের প্রাথমিক শব্দ হিসাবে এটি প্রয়োগ করতে নির্দেশ দিন।"
জোনাথন ওয়াকলি

4
@ h9uest যা "সি ++ লোক" এর সাথে কিছুই করার নয় , এগুলি হ'ল একটি আইএসও প্রযুক্তিগত কমিটির বিতরণের জন্য সরকারী নাম , iso.org/iso/home/standards_de વિકાસ
জোনাথন ওয়াকলি

31

যেমন আপনি নিজে বলেছেন, std::dynarrayএকটি স্থির-আকারের গতিশীল অ্যারের জন্য। এটি আকার পরিবর্তনযোগ্য নয়। এটা তোলে মোটামুটিভাবে একটি উন্নতি উপর কথা বলছে new T[N]এবং উপর std::unique_ptr<T[]>(new T[N])

ক্ষমতার আকার পরিবর্তন বা পরিচালনা করার দরকার নেই এর অর্থ আপনি কম জটিলতা সহ কম জায়গায় ডেটা কাঠামো বাস্তবায়ন করতে পারেন।

তদুপরি, std::dynarrayএকটি অদ্ভুত প্রাণী যা বাস্তবায়নটিকে বিভিন্ন, অ-নির্দিষ্ট উপায়ে প্রয়োগ করতে সহায়তা করে, উদাহরণস্বরূপ স্ট্যাকের মধ্যে অ্যারে রাখা সম্ভব। একটি বরাদ্দ ফাংশন কল করা "alচ্ছিক"। আপনি অ্যারের উপাদানগুলি তৈরি করতে একটি বরাদ্দকারীকে নির্দিষ্ট করতে পারেন, তবে এটি কোনও ধরণের অংশ নয়।

আপনিও ভাবতে পারেন যে আমাদের কেন std::dynarray এবং পরিবর্তনশীল দৈর্ঘ্যের অ্যারেগুলি প্রয়োজন। সি ++ 14 এর ভিএলএলগুলি অনেক বেশি বিধিনিষেধযুক্ত; এগুলি কেবল স্থানীয়, স্বয়ংক্রিয় ভেরিয়েবলগুলি হতে পারে এবং বরাদ্দ নীতি নির্দিষ্ট করার কোনও উপায় অফার করতে পারে না এবং অবশ্যই তাদের কোনও মানক ধারক ইন্টারফেস নেই।


"বর্তমান খসড়া" এর 23.3.4.2 এর কিছু উদাহরণ (এটি ধরুন, গুগল ক্যাশে):

explicit dynarray(size_type c);

প্রভাব:c উপাদানগুলির জন্য স্টোরেজ বরাদ্দ করে। বিশ্বব্যাপী ডাকতে পারে বা নাও পারে operator new

template <class Alloc>
dynarray(size_type c, const Alloc& alloc);

প্রভাবসমূহ: প্রতিটি উপাদান ব্যবহার-বরাদ্দকারী নির্মাণের সাহায্যে নির্মিত হয় ব্যতীত পূর্ববর্তী নির্মাণকারীদের সমতুল্য ।

আপনি অ্যারে উপাদানগুলি তৈরির জন্য প্রদত্ত বরাদ্দ ব্যবহার করতে পারেন বা না তা বিশ্বব্যাপী বৈশিষ্ট্য:

টেমপ্লেট কাঠামো Use_allocator, Alloc>: true_type {};

প্রয়োজনীয়: Alloc একজন বরাদ্দকারী হতে হবে (17.6.3.5)। [ দ্রষ্টব্য: এই বৈশিষ্ট্যের বিশেষায়িতকরণ অন্যান্য লাইব্রেরির উপাদানগুলিকে অবহিত করে dynarrayযা একটি বরাদ্দকারী দিয়ে তৈরি করা যেতে পারে, যদিও এতে নেস্টেড বরাদ্দকারী_প্রকার নেই]]

সম্পাদনা: জোনাথন ভেকলির উত্তরটি আরও বেশি প্রামাণিক এবং অন্তর্দৃষ্টিযুক্ত হতে বাধ্য।


বরাদ্দকারীর কাছে বরাদ্দকারীকে পাস dynarrayকরা কখনই বরাদ্দের জন্য ব্যবহৃত হয় না, এটি কেবলমাত্র উপাদানগুলির নির্মাণকারীদের ("ব্যবহার-বরাদ্দকারী নির্মাণ" ব্যবহার করে) যুক্তি হিসাবে ব্যবহৃত হয়। এই কারণেই যদি আপনি বরাদ্দ ব্যবহার করা হয় তবে আপনি জিজ্ঞাসা করতে পারবেন না: কারণ এটি কখনও হয় না।
জোনাথন ওয়াকলি

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