خوش آموز درخت تو گر بار دانش بگیرد، به زیر آوری چرخ نیلوفری را


آموزش زبان ++C : اندازه متغیرها و عملگر sizeof

آموزش زبان ++C : اندازه متغیرها و عملگر sizeof
نویسنده : امیر انصاری
همانطور که در درس های قبلی یاد گرفتید، در مکانیزم های مدرن (امروزی) حافظه (memory) معمولاً در اندازه هایی در واحد بایت (byte-sized) سازماندهی می شود، که هر کدام از این بایت ها یک آدرس انحصاری دارند. تا این لحظه، مفید بود که به حافظه به شکل تعدادی لانه کبوتر یا صندوق پستی نگاه کنید که ما می توانیم اطلاعات را داخل آنها قرار بدهیم و همینطور از داخل آنها بازیابی کنیم، همچنین نام متغیرها برای بازیابی اطلاعات از این لانه های کبوتر یا صندوق های پستی مورد نیاز ما می باشد.

سیستم یکپارچۀ سازمانی راهکار



با این حال، این مقایسه از یک جنبه کاملاً درست نیست، اکثر متغیرها بیش از 1 بایت از حافظه را اشغال می کنند. در نتیجه، یک متغیر ممکن است 2 یا 4 و یا حتی 8 آدرس حافظه متوالی را استفاده کند. مقدار حافظه ای که یک متغیر اشغال می کند بستگی به نوع داده (data type) آن متغیر دارد. خوشبختانه، از آنجا که ما با استفاده از نام متغیرها به حافظه دسترسی پیدا می کنیم و نه با استفاده از آدرس های حافظه (memory addresses)، کامپایلر می تواند جزئیات پشت صحنه این کار را از دید ما مخفی سازد و ما بدون هیچ نگرانی از بابت اندازه متغیر و نحوه آدرس دهی آن در حافظه، می توانیم براحتی با حافظه کار کنیم.

چند دلیل وجود که مفید است تا بدانید یک متغیر چه مقدار از حافظه را اشغال می کند.

اول اینکه، هر چقدر میزان فضای اختصاص داده شده به یک متغیر بیشتر باشد، آن متغیر می تواند اطلاعات بیشتری را در خودش جای دهد. از آنجا که هر بیت (bit) تنها می تواند مقادیر 0 و 1 را در خودش نگهدارد، در نتیجه هر بیت قادر به نگهداری دو وضعیت می باشد.

2 بیت می تواند 4 وضعیت متفاوت را در خودش نگهداری کند :

آموزش زبان ++C : اندازه متغیرها و عملگر sizeof
3 بیت می تواند 8 وضعیت متفاوت را در خودش نگهداری کند :

آموزش زبان ++C : اندازه متغیرها و عملگر sizeof
اگر بخواهیم این قاعده را به فرمول در بیاوریم یک متغیر با n بیت می تواند 2 به توان n وضعیت را در خودش نگهداری کند. به عنوان مثال یک متغیر 8 بیتی (که در واقع 1 بایت می شود) می تواند 2 به توان 8 وضعیت ممکن که برابر 256 وضعیت می باشد را در خودش نگهداری کند.

اندازه متغیر (size of the variable) محدودیتی در مقدار اطلاعاتی که در آن متغیر می تواند ذخیره گردد، اعمال می کند. هر چقدر اندازه یک متغیر بزرگتر باشد، طبیعتاً داده های بیشتری را می تواند در خودش ذخیره کند.

دوم اینکه، کامپیوترها مقدار حافظه آزاد محدودی دارند. هر وقتی که یک متغیری را معرفی می کنیم، یک بخش کوچک از حافظه به آن متغیر تخصیص داده می شود و تا زمانی که آن متغیر به حیات خودش ادامه می دهد آن بخش از حافظه همچنان در اشغال آن متغیر خواهد بود. از آنجا که کامپیوترهای مدرن مقدار زیادی حافظه (memory) دارند، این موضوع معمولاً مشکلی ایجاد نمی کند، مخصوصاً اگر بخواهیم تعداد کمی متغیر معرفی کنیم. با این حال در برنامه هایی که تعداد زیادی متغیر معرفی میکنند (مثلا صدهزار متغیر)، تفاوت اینکه از متغیرهای 1 بایتی و یا متغیرهای 8 بایتی استفاده کنیم، چشمگیر خواهد بود.

اندازه (size) متغیرهای اصلی در زبان ++C


پرسش بدیهی بعدی اینست که هر نوع داده (data type) متفاوت از متغیرها، چه میزان از فضای حافظه را اشغال می کند؟ ممکن است از شنیدن این پاسخ شگفت زده شوید که میزان فضای اشغال شده توسط متغیرها بسته به کامپایلر و معماری کامپیوتر، متفاوت می باشد!

زبان برنامه نویسی ++C تضمین می کند که انواع داده های اصلی آن دارای حداقل اندازه مورد نیاز طبق جدول زیر می باشند :

آموزش زبان ++C : اندازه متغیرها و عملگر sizeof
با این حال، اندازه واقعی متغیرها، ممکن است روی کامپیوتر شما متفاوت از این مقادیر باشد (به ویژه نوع داده int که غالباً 4 بایت می باشد). برای اینکه بتوانید اندازه واقعی یک متغیر را روی کامپیوتر خودتان مشاهده کنید می توانید از عملگر sizeof در زبان ++C استفاده کنید. عملگر sizeof یک عملگر یگانی (unary) می باشد که یک نوع داده یا یک متغیر را می گیرد و اندازه آن را در واحد بایت برمیگرداند. شما می توانید برنامه زیر را روی کامپیوتر خودتان کامپایل و اجرا کنید تا اندازه واقعی انواع داده ها را بر روی کامپیوتر خودتان بتوانید ببینید :

#include "iostream"

int main()
{
std::cout << "bool:\t\t" << sizeof(bool) << " bytes" << std::endl;
std::cout << "char:\t\t" << sizeof(char) << " bytes" << std::endl;
std::cout << "wchar_t:\t" << sizeof(wchar_t) << " bytes" << std::endl;
std::cout << "char16_t:\t" << sizeof(char16_t) << " bytes" << std::endl; // C++11, may not be supported by your compiler
std::cout << "char32_t:\t" << sizeof(char32_t) << " bytes" << std::endl; // C++11, may not be supported by your compiler
std::cout << "short:\t\t" << sizeof(short) << " bytes" << std::endl;
std::cout << "int:\t\t" << sizeof(int) << " bytes" << std::endl;
std::cout << "long:\t\t" << sizeof(long) << " bytes" << std::endl;
std::cout << "long long:\t" << sizeof(long long) << " bytes" << std::endl; // C++11, may not be supported by your compiler
std::cout << "float:\t\t" << sizeof(float) << " bytes" << std::endl;
std::cout << "double:\t\t" << sizeof(double) << " bytes" << std::endl;
std::cout << "long double:\t" << sizeof(long double) << " bytes" << std::endl;
return 0;
}

خروجی این برنامه بر روی یک کامپیوتر شخصی بنده که 64 بیتی می باشد و ویندوز 10 روی آن نصب بوده است، و از کامپایلر ویژوال استودیو 2012 استفاده می کرده است به شکل زیر می باشد :

bool:           1 bytes
char: 1 bytes
wchar_t: 2 bytes
char16_t: 2 bytes
char32_t: 4 bytes
short: 2 bytes
int: 4 bytes
long: 4 bytes
long long: 8 bytes
float: 4 bytes
double: 8 bytes
long double: 8 bytes

اگر از کامپیوتر متفاوتی استفاده می کنید یا از کامپایلر دیگری استفاده می کنید، ممکن است نتایج این برنامه روی کامپیوتر شما متفاوت باشد. توجه داشته باشید که شما نمی توانید با استفاده عملگر sizeof اندازه نوع void را بدست بیاورید. از آنجا که نوع داده void برابر با بدون نوع می باشد، استفاده از عملگر sizeof در مورد آن منجر به ایجاد خطای زمان کامپایل می شود.

اگر در مورد t\ که در کد بالا استفاده شده است، ابهام دارید، باید بگوییم که یک علامت خاص برای افزودن تب در خروجی می باشد و ما از آن برای مرتب کردن خروجی در قالب ستون ها استفاده کرده ایم. در مورد t\ و سایر نمادهای خاص اینچنینی در آینده و در مبحث نوع داده char بیشتر بحث خواهیم کرد.

شما همچنین می توانید از عملگر sizeof در مورد خود متغیرها نیز استفاده کنید :

    int x;
std::cout << "x is " << sizeof(x) << " bytes" << std::endl;

x is 4 bytes

در مورد عملگر sizeof نسبت به سایر انواع داده ها، بازهم در درسهای آینده صحبت خواهیم کرد.


آموزش قبلی : آموزش زبان ++C : نوع داده Void

آموزش بعدی : آموزش زبان ++C : نوع داده Integer



نمایش دیدگاه ها (0 دیدگاه)

دیدگاه خود را ثبت کنید:

انتخاب تصویر ویرایش حذف
توجه! حداکثر حجم مجاز برای تصویر 500 کیلوبایت می باشد.