ho3ein.3ven
چهارشنبه 24 خرداد 1391, 16:07 عصر
سلام.
می خواستم بدونم تفاوت بین این دو از لحاظ حافظه چیه ؟
اگر کسی بلده با شکل توضیح بده ممنون
jannatmakan
پنج شنبه 25 خرداد 1391, 04:08 صبح
سلام. از اونجایی که توضیحات کتاب جعفر نژاد کامل و روان هست، از ایشون با کمی تصرّف نقل قول می کنم:
در ++C یونیون ها و کلاس ها (یا ساختارها ) به هم مرتبط اند. یونیون ساختمان داده ای است که تمام اعضای داده ای آن از یک محل شروع می شوند. در C یونیون فقط حاوی اعضای داده ای بود. ولی در ++C یونیون می تواند حاوی توابع عضو هم باشد. اعضای یونیون در حالت عادی به صورت عمومی اند. به عنوان مثال یونیون زیر را درنظر بگیرید:
union swap
{
int x;
float y;
char ch;
};
swap p;
با این دستورات یونیون swap با سه عضوی x,y,ch تعریف می شود. و متغیّر p از نوع یونیون swap تعریف می گردد. همانطور که در شکل زیر مشاهده می کنید، عناصر یونیون در حافظه بدین صورت ذخیره می شوند.
88234
که طول کلّ یونیون برابر با 4 است. یعنی برابر با بزرگترین عضو آن بنابراین حافظه ی تمامی اعضا از یک مکان خواهد بود. به همین خاطر است که هر دفعه فقط از یک عضو یونیون می توان استفاده کرد. زیرا با مقدار دادن هر عضو، دیگر مقادیر دستکاری می شود. چون مکان شروع آنها در حافظه از یک آدرس است.
Ananas
پنج شنبه 25 خرداد 1391, 15:21 عصر
سلام.
ممنون از دوستمون ولی منم با یک مثال توضیح بدم تا بهتر متوجه بشید.
struct TMatrix3D
{
float _11, _12, _13;
float _21, _22, _23;
float _31, _32, _33;
};
مثلا فرض کن ما همچین ساختمانی رو برای یک ماتریس 3 در 3 تعریف کردیم. یعنی ما نیاز داریم به 9 تا عدد. حالا اگه بخوایم به شکل آرایه (بهتر بگم تو حلقه با استفاده از اندیس) به اعداد ماتریس دسترسی داشته باشیم باید چه کار کنیم؟ یک راهش اینه که اونا رو به شکل زیر تعریف کنیم :
struct TMatrix3D
{
float m[3][3];
};
حالا اگه بخوایم هر دو تا حالت رو داشته باشیم و به هر دو روش به اصلاعات دسترسی داشته باشیم باید از یک حافظه ی مشترک برای هر دو روش استفاده بشه یعنی ما هم به شکل اندیس آرایه و هم به شکل اسم هر مولفه به اجزای struct دسترسی داشته باشی و بتونیم اونا رو تغییر بدیم و با تغییر یکی اون یکی هم تغییر کنه پس باید از یک حافظه مشترک استفاده بشه. union به ما کمک میکنه که به اشکال مختلف به اطلاعات ساختمان دسترسی داشته باشیم. مثلا به دو روش مثل مثال زیر :
struct TMatrix3D
{
union
{
struct
{
float _11, _12, _13;
float _21, _22, _23;
float _31, _32, _33;
};
float m[3][3];
};
};
یکی با اسم هر جزئ مثلا :
TMatrix3D matrix3D;
matrix3D._13 = 1.0f;
matrix3D._32 = 0.0f;
دوم به شکل آرایه مثل :
matrix3D.m[0][2] = 1.0f;
matrix3D.m[2][1] = 1.0f;
_________________________________
یک مثال ساده تر :
struct TVec3D
{
union
{
struct
{
float x, y, z;
};
float f[3];
};
};
یک بردار سه تایی که ما می خوایم هم به شکل x , y , z باهاش کار کنیم و هم به شکل آرایه با اندیس که تو حلقه میتونه کمک کنه.
________________________
حالا همون ماتریس رو میتونیم با سه تا روش دسترسی تعریف کنیم :
struct TMatrix3D
{
union
{
struct
{
float _11, _12, _13;
float _21, _22, _23;
float _31, _32, _33;
};
TVec3D v[3];
float m[3][3];
};
};
حالا داریم :
matrix3D._21 == matrix3D.v[1].x == matrix3D.m[1][0];
فقط یه نکته اینکه آرایه ها از 0 شروع میشن.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.