কেন অ্যারের এর মাত্রার অংশটি এর ধরণের?


14

সি ++ প্রিমার বইটি পড়ার সময় আমি এই বিবৃতিটি পেলাম: "একটি অ্যারেতে উপাদানের সংখ্যা অ্যারের ধরণের অংশ।" সুতরাং আমি নিম্নলিখিত কোডটি ব্যবহার করে সন্ধান করতে চাই:

#include<iostream>

int main()
{
    char Array1[]{'H', 'e', 'l', 'p'};
    char Array2[]{'P', 'l', 'e', 'a', 's', 'e'};

    std::cout<<typeid(Array1).name()<<std::endl;        //prints  A4_c
    std::cout<<typeid(Array2).name()<<std::endl;        //prints  A6_c

    return 0;
}

এবং আকর্ষণীয়ভাবে দুটি অ্যারেতে টাইপডের ফলাফল দেখিয়েছিল যে তারা কোনওরকম আলাদা different

  • পর্দার আড়ালে কী চলছে?
  • অ্যারের এর আকারের অন্তর্ভুক্ত টাইপ থাকা কেন প্রয়োজন? এটির কারণেই কি এর আকার পরিবর্তন করা উচিত নয়?
  • এটি অ্যারে তুলনা করে কীভাবে প্রভাব ফেলবে?

শুধু ধারণাটি গভীরভাবে বুঝতে সক্ষম হতে চাই।


3
আকারে আকারের তথ্য অন্তর্ভুক্ত করার জন্য এটি কঠোরভাবে প্রয়োজনীয় নয় , তবে এটি দরকারী
বাইসোর

অ্যারে সম্পর্কিত কোনও টিউটোরিয়াল (1) ব্যাখ্যা করবে। (3) আপনি কী বোঝায় তা নিশ্চিত নই, যেহেতু অ্যারের তুলনা করার কোনও বিল্টিন উপায় নেই।
হলিব্ল্যাকগেট

উত্তর:


20

পর্দার আড়ালে কী চলছে?

সংজ্ঞা অনুসারে একটি অ গতিশীল বরাদ্দ হ'ল একজাতীয় উপাদানগুলির একটি নির্দিষ্ট আকারের ধারক। Nটাইপের উপাদানগুলির একটি অ্যারে Tমেমরির Nমধ্যে টাইপের অবজেক্টের সংলগ্ন ক্রম হিসাবে স্থাপন করা হয় T


অ্যারেরগুলির জন্য এটির আকারের অন্তর্ভুক্ত কোনও ধরণের থাকা কেন প্রয়োজন?

অ্যারের ধরণের জন্য এটির আকার অন্তর্ভুক্ত করা "প্রয়োজনীয়" বলে আমি বিশ্বাস করি না - সত্যিকার অর্থে, আপনি Tঅবজেক্টের একটি সামঞ্জস্যপূর্ণ অনুক্রমকে নির্দেশ করতে পয়েন্টার ব্যবহার করতে পারেন । এই জাতীয় পয়েন্টার অ্যারের সম্পর্কে আকারের তথ্য হারাবে।

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

void foo(int(&array)[4]) { /* ... */ }
void foo(int(&array)[8]) { /* ... */ }

বা ধ্রুবক অভিব্যক্তি হিসাবে অ্যারের আকার নির্ধারণ করতে

template <typename T, std::size_t N>
constexpr auto sizeOf(const T(&array)[N]) { return N; }

এটি অ্যারে তুলনা করে কীভাবে প্রভাব ফেলবে?

আসলে তা হয় না।

আপনি সি-স্টাইল অ্যারের সাথে একইভাবে তুলনা করতে পারবেন না আপনি দুটি সংখ্যার (যেমন intবস্তু) তুলনা করবেন । আপনাকে কিছু ধরণের অভিধান সংক্রান্ত তুলনা লিখতে হবে এবং বিভিন্ন আকারের সংগ্রহের জন্য এর অর্থ কী তা সিদ্ধান্ত নিতে হবে। std::vector<T>এটি সরবরাহ করে এবং অ্যারেগুলিতে একই যুক্তি প্রয়োগ করা যেতে পারে।


বোনাস: সি ++ 11 এবং উপরে সরবরাহ করে std::array, যা একটি ধারক-জাতীয় ইন্টারফেস সহ সি-স্টাইল অ্যারের চারপাশে একটি র‌্যাপার। এটি সি-স্টাইলের অ্যারেগুলিতে পছন্দ করা উচিত কারণ এটি অন্যান্য পাত্রে (উদাহরণস্বরূপ std::vector<T>) তুলনায় আরও সুসংগত এবং বাক্সের বাইরে অভিধানের তুলনামূলক সমর্থন করে।


2
"আপনাকে কিছু ধরণের অভিধানের তুলনা লিখতে হবে এবং বিভিন্ন আকারের সংগ্রহের জন্য এর অর্থ কী তা সিদ্ধান্ত নিতে হবে।" আপনি কেবল ব্যবহার করতে পারেন std::equal(এর মাধ্যমে std::beginএবং std::endযা অ্যারেগুলির জন্য সংজ্ঞায়িত)। সেক্ষেত্রে বিভিন্ন আকারের অ্যারেগুলি সমান নয়।
স্টু

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

8

আপনি যখন কোনও বস্তু তৈরি করবেন তখন সেই পরিমাণের পরিমাণ বরাদ্দ করা হয় তা পুরোপুরি তার ধরণের উপর নির্ভর করে। আমি যে বরাদ্দের কথা বলছি তা বরাদ্দ newবা না থেকে বরাদ্দ নয় malloc, তবে বরাদ্দ করা স্থানটি যাতে আপনি আপনার নির্মাতাকে পরিচালনা করতে পারেন এবং আপনার অবজেক্টটি আরম্ভ করতে পারেন।

আপনার যদি কোনও কাঠামো হিসাবে সংজ্ঞায়িত করা হয় (উদাহরণস্বরূপ)

struct A { char a, b; }; //sizeof(A) == 2, ie an A needs 2 bytes of space

তারপরে আপনি যখন অবজেক্টটি নির্মাণ করবেন:

A a{'a', 'b'};

আপনি প্রক্রিয়া হিসাবে অবজেক্টটি নির্মাণের প্রক্রিয়াটি সম্পর্কে ভাবতে পারেন:

  • 2 বাইট স্থান বরাদ্দ করুন (স্ট্যাকের মধ্যে, তবে এই উদাহরণের জন্য কোথায় গুরুত্বপূর্ণ নয়)
  • অবজেক্টের কনস্ট্রাক্টর চালান (এই ক্ষেত্রে অনুলিপি 'a'এবং 'b'অবজেক্টে)

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

char a[] = {'a'}; //need space for 1 element
char b[] = {'a', 'b', 'c', 'd', 'e'}; //need space for 5 elements

ধরনের তাই aএবং bএটা সত্য যে প্রতিফলিত হবে a1 গৃহস্থালির কাজ জন্য পর্যাপ্ত স্থান প্রয়োজন এবং b5 অক্ষর জন্য পর্যাপ্ত স্থান প্রয়োজন। এর অর্থ এই যে অ্যারেগুলির আকারটি হঠাৎ করে পরিবর্তন হতে পারে না, একবার 5-উপাদান অ্যারে তৈরি হয়ে গেলে এটি সর্বদা 5-উপাদান অ্যারে হয় is "অ্যারে" -র মতো অবজেক্টগুলি রাখতে যেখানে আকারটি পৃথক হতে পারে, আপনার গতিশীল মেমরির বরাদ্দ থাকা দরকার যা আপনার বইটি কোনও পর্যায়ে আবরণ করা উচিত।


0

এটি রানটাইম লাইব্রেরির অভ্যন্তরীণ কারণে। আপনি উদাহরণস্বরূপ নিম্নলিখিত বিবৃতি বিবেচনা করুন:

unsigned int i;
unsigned int *iPtr;
unsigned int *iPtrArr[2];
unsigned int **iPtrHandle;

তারপরে এটি স্পষ্ট হয়ে ওঠে যে সমস্যাটি কী: উদাহরণস্বরূপ, ঠিকানাটির ঠিকানা বা ঠিকানা দেওয়ার unsigned int *সাথে নিজেকে উদ্বেগ করতে হবে ।sizeof operatorunsigned int

আপনি এখানে যা দেখছেন তার বিশদ বিশদ ব্যাখ্যা রয়েছে তবে ঘোষিত প্রকারের সরল ভাষার পাঠ্যকে যে প্রোগ্রামটি প্রিন্ট করে সেই প্রোগ্রাম সম্পর্কিত কর্নিগান এবং রিচি দ্বারা সি প্রোগ্রামিং ল্যাঙ্গুয়েজে ২ য় সংস্করণ যা আচ্ছাদিত ছিল তার মূলত এটি পুনরুক্তি স্ট্রিং।

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