সংকলন সময়ে বরাদ্দ করা মেমরির অর্থ কম্পাইলার সংকলন সময়ে সমাধান হয় যেখানে প্রক্রিয়া মেমরির মানচিত্রের ভিতরে নির্দিষ্ট কিছু বরাদ্দ করা হবে।
উদাহরণস্বরূপ, একটি বিশ্বব্যাপী অ্যারে বিবেচনা করুন:
int array[100];
সংকলকটি অ্যারের আকার এবং একটি এর int
আকার সংকলন সময়ে জানে, সুতরাং এটি সংকলন-সময় অ্যারের পুরো আকারটি জানে। এছাড়াও একটি গ্লোবাল ভেরিয়েবলের ডিফল্টরূপে স্থিতিশীল স্টোরেজ সময়কাল থাকে: এটি প্রক্রিয়া মেমরি স্পেসের (.data / .bss বিভাগ) স্ট্যাটিক মেমরির ক্ষেত্রে বরাদ্দ করা হয়। সেই তথ্য দেওয়া, সংকলক সেই স্থির মেমরির অ্যাড্রে কী ঠিকানা হবে তা সংকলনের সময় সিদ্ধান্ত নেয় ।
অবশ্যই সেই মেমরি ঠিকানাগুলি ভার্চুয়াল ঠিকানা addresses প্রোগ্রামটি ধরে নিয়েছে যে এটির নিজস্ব পুরো মেমরি স্পেস রয়েছে (উদাহরণস্বরূপ 0x00000000 থেকে 0xFFFFFFFF)। এজন্য সংকলক "ঠিক আছে, অ্যারে 0x00A33211 ঠিকানায় হবে" এর মতো অনুমানগুলি করতে পারে। রানটাইমের সময় ঠিকানাগুলি এমএমইউ এবং ওএস দ্বারা বাস্তব / হার্ডওয়্যার ঠিকানায় অনুবাদ করা হয়।
মান সূচনা স্ট্যাটিক স্টোরেজ জিনিসগুলি কিছুটা আলাদা। উদাহরণ স্বরূপ:
int array[] = { 1 , 2 , 3 , 4 };
আমাদের প্রথম উদাহরণে, সংকলক কেবল স্থিরীকৃত স্থানে সেই তথ্য সংরক্ষণ করে কোথায় অ্যারে বরাদ্দ হবে তা স্থির করে।
মান-আরম্ভের জিনিসগুলির ক্ষেত্রে, সংকলকটি অ্যারের প্রাথমিক মানটিকে এক্সিকিউটেবলের মধ্যেও ইনজেকশন দেয় এবং কোড যুক্ত করে যা প্রোগ্রাম লোডারকে বলে যে প্রোগ্রাম শুরু করার সময় অ্যারে বরাদ্দের পরে অ্যারে এই মানগুলি পূরণ করা উচিত।
সংকলক দ্বারা উত্পাদিত সমাবেশের দুটি উদাহরণ এখানে রয়েছে (x86 টার্গেট সহ GCC4.8.1):
সি ++ কোড:
int a[4];
int b[] = { 1 , 2 , 3 , 4 };
int main()
{}
আউটপুট সমাবেশ:
a:
.zero 16
b:
.long 1
.long 2
.long 3
.long 4
main:
pushq %rbp
movq %rsp, %rbp
movl $0, %eax
popq %rbp
ret
আপনি দেখতে পাচ্ছেন, মানগুলি সরাসরি সমাবেশে ইনজেকশনে থাকে। অ্যারেতে a
, সংকলকটি 16 বাইটের শূন্য সূচনা উত্পন্ন করে, কারণ স্ট্যান্ডার্ড বলে যে স্ট্যাটিক সঞ্চিত জিনিসগুলি ডিফল্টরূপে শূন্যে শুরু করা উচিত:
8.5.9 (প্রারম্ভিক) [দ্রষ্টব্য]:
স্ট্যাটিক স্টোরেজ সময়কালের প্রতিটি বস্তু প্রোগ্রামের শুরুতে শূন্য-আরম্ভীকৃত হয় অন্য কোনও প্রাথমিক-আইকেশন হওয়ার আগে। কিছু ক্ষেত্রে, অতিরিক্ত সূচনা পরে করা হয়।
আমি সবসময় লোকদের তাদের কোড বিচ্ছিন্ন করার পরামর্শ দিই যাতে সি ++ কোডটি দিয়ে কম্পাইলারটি আসলে কী করে তা দেখতে। এটি স্টোরেজ ক্লাস / সময়কাল (এই প্রশ্নের মতো) থেকে উন্নত সংকলক অপ্টিমাইজেশনে প্রযোজ্য। আপনি আপনার সংকলকটি সমাবেশ উত্পন্ন করতে নির্দেশ দিতে পারেন, তবে ইন্টারনেটে বন্ধুত্বপূর্ণ উপায়ে এটি করার জন্য দুর্দান্ত সরঞ্জাম রয়েছে। আমার প্রিয় জিসিসি এক্সপ্লোরার ।