PDA

View Full Version : سوال: مشکل با Data Alignment



H_G_G_I
جمعه 22 دی 1391, 21:27 عصر
سلام
دوستان من یه مشکل با ترتیب اعضای کلاسم دارم !
من Data Alignment رو گذاشتم رو 4 بایت و مثلا این کلاس رو دارم ::

class Mylass
{
public:
bool a;
//3byte unused
int b;
short c;
//2byte unused
float d;
};

ولی بعد اولین متغیر 3 بایت خالی می زاره !
من امار نوع داده این متغییر هارو به ترتیب دارم و می خوام وقتی ادرس شی رو به علاوه یه بایت می کنم ادرس متغییر دوم رو بگیرم !
یعنی نباید بین متغیر ها فضا خالی در نظر گرفته بشه و یا جابه جا بشن !:ناراحت:
می خوام اون اینطوری بشه ! چی کار کنم ؟
تو VS تنظیمات خاصی نداره تنظیم کنم :ناراحت:

class Mylass
{
public:
bool a;
int b;
short c;
float d;
//1 byte unused
};

the king
شنبه 23 دی 1391, 06:00 صبح
قبل از تعریف struct تون و بعد از اون از pragma pack# استفاده کنید :


#pragma pack(1)
class Mylass
{
public:
bool a;
int b;
short c;
float d;
};
#pragma pack()

H_G_G_I
شنبه 23 دی 1391, 09:53 صبح
خب این میاد Data Alignment رو 1 میکنه ! نمی خوام 1 باشه میخوام 4 باشه !:عصبانی++:

Ananas
شنبه 23 دی 1391, 10:56 صبح
یعنی چی که می خوای 4 باشه؟ خوب 4 یعنی اینکه بعد از bool سه بایت برات خالی بگذاره دیگه. حالا می خوای هم باشه هم نباشه؟
برای برگردوندن به حالت 4 بعد از تعریف struct از عبارت push و pop در pragma pack استفاده کنید :

#pragma pack(push, 1)
class Mylass
{
public:
bool a;
int b;
short c;
float d;
};
#pragma pack(pop)

H_G_G_I
شنبه 23 دی 1391, 13:38 عصر
اصلا اگه تو تنطیمات پروژه بزارم رو یک که این #pragma pack رو هم نمیخواد !
4 باشه بهتره دیگه سریع تر حافظه میگیره و ... در حالت عادی 4 بایته !
الان با 1 سایز کلاس میشه 11 ولی با 4 باید بشه 12
می خوام اینطوری بشه دیگه

class Mylass
{
public:
bool a;
int b;
short c;
float d;
//1 byte unused
};

the king
شنبه 23 دی 1391, 15:57 عصر
این Align ای که مد نظر شما است صرف نظر از مقدارش مطابق روال Align های مرسوم نیست.



#pragma pack(1)
class Mylass
{
public:
bool a;
int b;
short c;
float d;
char useless;
};
#pragma pack()