PDA

View Full Version : اشتباه كامپايلر در sizeof



JalaliMehr
جمعه 01 مرداد 1389, 10:50 صبح
من يه كلاس به اين صورت تعريف كردم.

class CBox
{
public :

double Height;
int m_width;

};


cout<<sizeof CBox<< endl;sizeof به من 16 ميده.4+8=12 چرا 16.
علتش چيه؟

PC2st
جمعه 01 مرداد 1389, 11:01 صبح
این ۴ بیتی که اضافه شده، بخاطر مسئله alignment یا همان ترازبندی داده‌ها است که برای افزایش کارآیی مورد استفاده قرار می‌گیرد.
بطور کلی، اندازه داده‌ها باید حاصلضربی از word size سیستم باشد.
مثلا حافظه را اینطور در نظر بگیرید که به بخش‌های ۴ بایتی تقسیم‌بندی شده (در سیستم‌های ۳۲-بیتی)...

JalaliMehr
جمعه 01 مرداد 1389, 14:14 عصر
پس اينطوري باشه sizeof همينطوري يه عددي رو بر مي گردونه.از C++ بعيده. زبانهاي ديگه كه اينطوري نيست

Nima_NF
جمعه 01 مرداد 1389, 15:21 عصر
برای بهینه سازی طبق معماری CPU ها این کار لازم هست.

لذا کامپایلرها خودکار عمل Padding را انجام می دهد.
اگر قرار نیست این عمل انجام شود و خودتان می خواهید کنترل لازم را داشته باشید باید با توجه به کامپایلر تغییرات لازم را انجام دهید.

مثلا در ++visual C به این شکل padding مقدار 2 بایت می شود و جواب خروجی 6 می شود:



#pragma pack(2)

class CBox
{
public :
int Height;
short Height6;
};

#pragma pack()

برای gcc نیز گزینه های مشابه وجود دارد، مثلا با __attribute__



مطمئن باشید اگر ++C/C آنقدر که فکر می کنید اشتباه می کرد این همه محبوب نشده بود، این همان قدرت کنترلی این گونه زبان ها به همراه کامپایلرهای آن ها هست که برخلاف زبان های مورد نظر شما باید توسط شما تنظیم شود.

PC2st
جمعه 01 مرداد 1389, 21:59 عصر
پس اينطوري باشه sizeof همينطوري يه عددي رو بر مي گردونه.از C++‎‎‎‎‎ بعيده. زبانهاي ديگه كه اينطوري نيست sizeof از روی میل رفتار نمی‌کند که همینطوری یک عدد را برگرداند. در واقع رفتار sizeof کاملا مشخص و کاملا قابل پیش‌بینی است و با توجه به معماری سیستم، کاملا می‌توان تشخیص داد که ++C در چه مواردی از padding برای ترازبندی داده‌ها در حافظه استفاده خواهد کرد.

seyedof
شنبه 16 مرداد 1389, 17:42 عصر
سلام

روش قابل حمل تر برای تعیین structure padding اینکلود کردن هدر های زیر است که روی اکثر کامپایلرها کار میکند. #pragma ها خیلی به کامپایلر وابسته هستند.

#include <pshpack1.h>
,...



ممنون علی