সি ++ এ স্ট্যাটিক অ্যারে বনাম গতিশীল অ্যারে


91

একটি স্ট্যাটিক অ্যারে এবং সি ++ এ ডায়নামিক অ্যারের মধ্যে পার্থক্য কী?

আমাকে আমার ক্লাসের জন্য একটি অ্যাসাইনমেন্ট করতে হবে এবং এটি বলছে স্ট্যাটিক অ্যারেগুলি ব্যবহার করবেন না, কেবল গতিশীল অ্যারেগুলি। আমি বইটি এবং অনলাইনে দেখেছি, তবে আমি বুঝতে পারছি না।

আমি ভেবেছিলাম স্টাইলিকটি সংকলনের সময় এবং রানটাইম সময়ে গতিশীল তৈরি হয়েছিল, তবে আমি মেমরি বরাদ্দ দিয়ে ভুল করতে পারি।

আপনি কি সি ++ এ স্ট্যাটিক অ্যারে এবং ডায়নামিক অ্যারের মধ্যে পার্থক্যটি ব্যাখ্যা করতে পারেন?


4
স্থির গতিশীল বিপরীতে নয়। হয় আপনি যে বইটি ব্যবহার করছেন তা ভয়ানক বা আপনি প্রসঙ্গের বাইরে নিয়ে যাচ্ছেন। আমি নীচে একটি নতুন উত্তর যুক্ত করতে যাচ্ছি আশা করি এটি পরিষ্কার করতে।
জোশুয়া ক্লেটন 15

4
এই প্রশ্নের চিত্রটি দেখুন: স্ট্যাকওভারফ্লো.com / a / 11698458 / 1143274 স্ট্যাটিক অ্যারেগুলি স্ট্যাক বা স্তূপে বরাদ্দ করা হয় না।
এভেজেনি সার্জিভ

* স্থির অ্যারে বনাম গতিশীল অ্যারে
সিএসগুই

উত্তর:


102

স্থানীয় অ্যারেগুলি স্ট্যাকের উপরে তৈরি করা হয় এবং এতে স্বয়ংক্রিয় স্টোরেজ সময়কাল থাকে - আপনাকে ম্যানুয়ালি মেমরি পরিচালনা করতে হবে না, তবে তারা যখন ফাংশনটি শেষ করেন তখন তা নষ্ট হয়ে যায়। অগত্যা তাদের একটি নির্দিষ্ট আকার থাকতে হবে:

int foo[10];

তৈরি করা অ্যারেগুলির operator new[]গতিশীল স্টোরেজ সময়কাল এবং এটি হিপ (প্রযুক্তিগতভাবে "ফ্রি স্টোর") এ সংরক্ষণ করা হয়। এগুলির যে কোনও আকার থাকতে পারে তবে তারা স্ট্যাক ফ্রেমের অংশ না হওয়ায় আপনাকে এগুলিকে বরাদ্দ করতে এবং তাদের মুক্ত করতে হবে:

int* foo = new int[10];
delete[] foo;

18
এটি সঠিক, তবে এটি কীভাবে কাজ করে তা কেবল চিত্রিত করার জন্য। দয়া করে এটি বাস্তব কোডে করবেন না তবে পরিবর্তে একটি স্টাডি :: ভেক্টর ব্যবহার করুন।
এডি প্রোঙ্ক

23
@ এডি: এটি কোনও ভেক্টর প্রয়োজন কিনা তা পরিস্থিতির উপর নির্ভর করে
কেসব্যাশ

6
@ ক্যাসবাশ: কোন পরিস্থিতিতে আপনি কোন অ্যারে পছন্দ করবেন? "আপনার সবসময় অ্যারের পরিবর্তে ভেক্টর বা ডিউক ব্যবহার করা পছন্দ করা উচিত" " - ভেষজ সুটার (আরও ব্যতিক্রমী সি ++)
এডি প্রোঙ্ক

16
@ এডিপ্রনক মেমরি খণ্ডিত কারণে কেউ একটি নির্দিষ্ট ধরণের অ্যারে ব্যবহার করতে পারে পুলের সাজ হিসাবে। প্রতিটি ক্ষেত্রেই গাদা দাবি করে না, স্ট্যাক ভিত্তিক অ্যারে ব্যবহারের বিশেষ সুবিধা রয়েছে। আপনি স্ট্যান্ড :: ভেক্টরকে সোনার হাতুড়ি হিসাবে দেখছেন, একটি সাধারণ অ্যান্টি-প্যাটার্ন।
void.pointer

4
@ এডিপ্রনক: আমি নিশ্চিত যে হার্ব সটার মানে গতিশীল অ্যারে, যেমন int* foo = new int[N]আপনার deleteনিজের কাছে থাকে এবং ব্যতিক্রমের উপস্থিতিতে সাবধান হন। স্ট্যাটিক অ্যারেগুলিতে এই সমস্যাগুলি নেই।
আলেকজান্ডার মালাখভ

31

স্ট্যাটিক সি এবং সি ++ এর একটি কীওয়ার্ড, সুতরাং একটি সাধারণ বর্ণনামূলক শর্তের চেয়ে স্থির বা অ্যারেতে প্রয়োগ করার সময় স্ট্যাটিকের খুব নির্দিষ্ট অর্থ থাকে। বিভ্রান্তি সংশ্লেষ করতে, এর পৃথক প্রসঙ্গে তিনটি স্বতন্ত্র অর্থ রয়েছে। এ কারণে, একটি স্ট্যাটিক অ্যারে হয় স্থির বা গতিশীল হতে পারে।

আমাকে বিস্তারিত বলতে দাও:

প্রথমটি সি ++ নির্দিষ্ট:

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

দু'জন সি থেকে উত্তরাধিকার সূত্রে প্রাপ্ত:

  • একটি ফাংশনের মধ্যে, একটি স্ট্যাটিক ভেরিয়েবল হ'ল ফাংশন কলগুলির মধ্যে যার স্মৃতি অবস্থান সংরক্ষণ করা হয়। এটি স্থিতিশীল যে এটি একবারে আরম্ভ করা হয় এবং ফাংশন কলগুলির মধ্যে এর মান ধরে রাখে (স্ট্যাটিক্সের ব্যবহার একটি ফাংশনটিকে অ-প্রতীকী করে তোলে, যেমন থ্রেডসেফ নয়)

  • ফাংশনের বাইরে ঘোষিত স্ট্যাটিক ভেরিয়েবলগুলি গ্লোবাল ভেরিয়েবলগুলি যা কেবল একই মডিউলটির মধ্যে থেকে অ্যাক্সেস করা যায় (অন্য কোনও # টির সাথে উত্স কোড ফাইল)

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


4
+1, আপনার উত্তরটি সবচেয়ে নির্ভুল এবং নির্ভুল এবং আরও বেশি ভোট পাওয়া উচিত ছিল।
জেড বোসন

আপনি যদি new[]অপারেটরের সাথে অ্যারের আকারটি ঘোষণা করেন তবে রানটাইম পর্যন্ত আকারটি কীভাবে জানা যায় না? অর্থাত্int* p = new int[10]
জুলফ

"এগুলি মূল ফাংশন চলার আগেই বরাদ্দ দেওয়া হয়।" প্রাসঙ্গিক ব্লক প্রবেশের আগে স্ট্যাক ভেরিয়েবলগুলি বরাদ্দ কেন?
সর্বদা

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

@ জোশুয়া ক্লেটন আমার মনে হয় এটি সঠিক হতে পারে না। যখন আপনি জানেন না যে এটি কতবার প্রবেশ করবে তখন আপনি পুনরাবৃত্তির জন্য স্ট্যাক ফ্রেমগুলি (বহুবচনটি লক্ষ্য করুন) কীভাবে বরাদ্দ করতে পারেন?
সর্বদা

11

আমি মনে করি আপনার ক্লাসে ব্যবহৃত শব্দার্থবিজ্ঞানগুলি বিভ্রান্ত করছে। সম্ভবত 'স্ট্যাটিক' বলতে যা বোঝায় তা হ'ল "ধ্রুব আকার" এবং সম্ভবত "গতিশীল" বলতে যা বোঝায় তা হ'ল "পরিবর্তনশীল আকার"। সেক্ষেত্রে সেই ক্ষেত্রে ধ্রুব আকারের অ্যারেটি দেখতে পারা যায়:

int x[10];

এবং একটি "গতিশীল" এক হ'ল যে কোনও ধরণের কাঠামো যা রানটাইমগুলিতে অন্তর্নিহিত স্টোরেজটি বাড়ানো বা হ্রাস করতে দেয়। বেশিরভাগ সময়, std::vectorসি ++ স্ট্যান্ডার্ড লাইব্রেরি থেকে ক্লাস যথেষ্ট হবে। এটি এর মতো ব্যবহার করুন:

std::vector<int> x(10); // this starts with 10 elements, but the vector can be resized.

std::vector আছে operator[]সংজ্ঞায়িত , যাতে আপনি এটি অ্যারের মতো একই শব্দার্থক দিয়ে ব্যবহার করতে পারেন।


4
আমি মনে করি এটি মোটামুটি পরিষ্কার যে "গতিশীল অ্যারে" দ্বারা তারা কেবলমাত্র একটি গতিশীল বরাদ্দকৃত অ্যারে বোঝায় (এটি একটি যা আকারটি গতিশীলভাবে রানটাইমের সময় নির্দিষ্ট করা যায়)। লাইকnew int[10]
জলফ

@ জালফ: আমি 'স্ট্যাটিক' শব্দটি নিয়ে বেশি উদ্বিগ্ন ছিলাম। ধারাবাহিকতার জন্য আমি একটি "গতিশীল অ্যারে" কে বরাদ্দযুক্ত বা পরিবর্তনশীল আকারের অ্যারে বলতে পছন্দ করি।
বেন কলিন্স

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

9

স্থির অ্যারে সংকলনের সময় মেমরি বরাদ্দ করা হয় এবং মেমরিটি স্ট্যাকের জন্য বরাদ্দ করা হয়। অন্যদিকে, গতিশীল অ্যারেগুলি রানটাইমে মেমরি বরাদ্দ করা হয় এবং মেমরিটি গাদা থেকে বরাদ্দ করা হয়।

int arr[] = { 1, 3, 4 }; // static integer array.   
int* arr = new int[3]; // dynamic integer array.

4
একটি গ্লোবাল অ্যারে একটি স্ট্যাটিক অ্যারে এবং এটি স্ট্যাক থেকে নয় একটি ডেটা বিভাগে প্রয়োগ করা হয়।
জেড বোসন

8

পদগুলি কী বোঝায় তার স্পষ্ট সংজ্ঞা থাকা গুরুত্বপূর্ণ important দুর্ভাগ্যক্রমে স্থির এবং গতিশীল অ্যারে বলতে কী বোঝায় তার একাধিক সংজ্ঞা রয়েছে বলে মনে হয়।

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

int x[10]; //static array with global scope
static int y[10]; //static array with file scope
foo() {
    static int z[10]; //static array with local scope

স্বয়ংক্রিয় ভেরিয়েবলগুলি সাধারণত স্ট্যাক-ভিত্তিক মেমরি বরাদ্দ ব্যবহার করে প্রয়োগ করা হয় । সি / সি ++ এর মতো একটি স্বয়ংক্রিয় অ্যারে তৈরি করা যেতে পারে:

foo() {
    int w[10]; //automatic array

এই অ্যারেগুলি x, y, z, এবংw মধ্যে যা আছে তা হ'ল তাদের প্রত্যেকের জন্য আকার নির্দিষ্ট করা হয় এবং সংকলনের সময় সংজ্ঞায়িত করা হয়।

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

সাধারণত গতিশীল অ্যারে বলতে যা বোঝায় সেটি হ'ল আকার পরিবর্তনযোগ্য নয় তবে এটি ব্যবহার করে কার্যকর করা হয়েছে আকার পরিবর্তনযোগ্য রান-টাইমে নির্ধারিত একটি নির্দিষ্ট আকার সহ গতিশীল মেমরি বরাদ্দ । সি ++ এ এটি newঅপারেটর ব্যবহার করে করা হয় ।

foo() {
   int *d = new int[n]; //dynamically allocated array with size n     

তবে রানটাইম ব্যবহার করে সংশোধন করা আকারগুলির সাথে একটি স্বয়ংক্রিয় অ্যারে তৈরি করা সম্ভব alloca:

foo() {
    int *s = (int*)alloca(n*sizeof(int))

সত্যিকারের গতিশীল অ্যারের std::vectorজন্য সি ++ (অথবা সিতে একটি পরিবর্তনশীল দৈর্ঘ্যের অ্যারে ) এর মতো কিছু ব্যবহার করা উচিত ।

ওপির প্রশ্নের কার্যবিধির জন্য কী বোঝানো হয়েছিল? আমি মনে করি এটি পরিষ্কার যে যা চেয়েছিল তা স্থির বা স্বয়ংক্রিয় অ্যারে নয় যা newঅপারেটর ব্যবহার করে গতিশীল মেমরি বরাদ্দ ব্যবহার করেছিল বা উদাহরণস্বরূপ একটি অ-স্থির আকারের অ্যারে ব্যবহার করেছিল std::vector


3

আমি মনে করি এই প্রসঙ্গে এটির অর্থ এটি স্থির হয়েছে যে আকারটি স্থির। স্টাড :: ভেক্টর ব্যবহার করুন। এটির একটি পুনরায় আকার () ফাংশন রয়েছে।


2

আপনার সিউডো ডায়নামিক অ্যারে থাকতে পারে যেখানে রানটাইমের সময় ব্যবহারকারীর দ্বারা আকার সেট করা থাকে তবে তার পরে এটি স্থির করা হয়।

int size;
cin >> size;
int dynamicArray[size];

স্ট্যান্ডার্ড সি ++ এর অংশ নয় (সি 99 এবং গিসির জন্য সংকলক এক্সটেনশন হিসাবে)।
ক্র্যাশস্ট্রিস্ট

1

স্ট্যাটিক অ্যারে :

  1. স্থির অ্যারে সংকলন সময়ে মেমরি বরাদ্দ করা হয়।
  2. আকার স্থির করা হয়েছে।
  3. স্ট্যাক মেমরি স্পেসে অবস্থিত।
  4. যেমন : ইনট অ্যারে [10]; // আকারের অ্যারে

গতিশীল অ্যারে:

  1. মেমরি রান সময় বরাদ্দ করা হয়।
  2. আকার নির্দিষ্ট করা হয় না।
  3. হিপ মেমরি স্পেসে অবস্থিত।
  4. যেমন : ইনট * অ্যারে = নতুন ইনট [10];

0

হ্যাঁ ঠিক স্ট্যাটিক অ্যারে সংকলনের সময় তৈরি করা হয়েছে যেখানে রান টাইমে গতিশীল অ্যারে তৈরি করা হয়। যেখানেই পার্থক্যটি তাদের মেমরির অবস্থানগুলির সাথে সম্পর্কিত সেখানে স্থির স্ট্যাকের উপর অবস্থিত এবং গতিশীল গাদাতে তৈরি করা হয়। Apিবিতে অবস্থিত সমস্ত কিছুই মেমরি পরিচালনার প্রয়োজন যতক্ষণ না এবং আবর্জনা সংগ্রহকারী। নেট ফ্রেমওয়ার্কের ক্ষেত্রে উপস্থিত না হলে অন্যথায় মেমরি ফাঁস হওয়ার ঝুঁকি থাকে।


0

স্ট্যাটিক অ্যারে: দক্ষতা। কোনও গতিশীল বরাদ্দ বা ডিওলোকেশন প্রয়োজন হয় না।

স্ট্যাটিক সংশোধক সহ ফাংশনে সি, সি ++ এ ঘোষিত অ্যারেগুলি অচল। উদাহরণ: স্ট্যাটিক ইন্ট ফু [5];


4
@ অ্যাডএমড্রু, এটি সত্য তবে প্রশ্নের উত্তরের উত্তর কখনও দেওয়া হয়নি। সেরা উত্তরটি জোশুয়া ক্লেটনের উত্তর তবে আমার মনে হয় এর চেয়ে ভাল উত্তর হ'ল এটি একটি স্ট্যাকওভারফ্লো.com
জেড বোসন

@ জেডবসন জেনে রাখা ভাল, ধন্যবাদ হে এবং আমি ঠিক বুঝতে পেরেছিলাম যে এখন প্রায় এক বছর আগে আমি এই মন্তব্যটি করেছি।
স্বীকৃত

-3

অ্যারে পাশের উপাদানগুলিতে স্ট্যাটিক অ্যারেটি মেইনস

অ্যারের পাশের উপাদানগুলিকে না দিয়ে গতিশীল অ্যারে মেইনস

উদাহরণ:

     char a[10]; //static array
       char a[];  //dynamic array

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