PDA

View Full Version : سوال: نحوه قرار گیری توابع و کلاس ها در حافظه؟



chikar
شنبه 16 خرداد 1394, 15:23 عصر
به حجم سوال توجه نکنید، بیشترش مال این هست که بتونم درست سوال رو تفهیم کنم! پس لطف کنید، این سوالات که فکر می کنم مشکل فعلی خیلی ها و سوالات آینده خیلی های دیگه هست رو کمی وقت بگذارید و جواب بدید، تشکر فراوان قبل از پاسخ شما!:لبخند::تشویق:

دو تا سوال کلی؟
اول، توابع قبل از فراخوانی و حین کامپایل درون حافظه قرار می گیرند، پس مثلا یه تابعی که از نوع برگشتی double استفاده کرده، قبل از فراخوانی 8 بایت براش در نظر گرفته میشه، اما دستورات تابع و متغیر های محلی تابع هم که تا تابع صدا زده نشه، ساخته نمی شن، پس این متغیرهای محلی و دستورات تابع، قبل از فراخوانی تابع و حین کامپایل به چه صورتی همراه تابع قرار می گیرند؟؟ فکر نمی کنم در اون فضای 8 بایتی قرار بگیرند، پس کجا و به چه صورت ذخیره می شن که حافظه ای رو نمی گیرند ولی هستند؟؟؟

سوال دوم، کلاس ها هم مشابه توابع قبل از ساخت شی و حین کامپایل در یه جایی باید ذخیره بشن دیگه :
1 - کلاس که مثل تابع نیست، که بگیم نوع برگشتی داره، مثلا double هست و 8 بایت براش در نظر می گیره، پس یه کلاس ساده بدون هیچ تابع یا متغیر عضوی که ساخته شده قبل از ساخت شی و حین کامپایل چه میزان فضا براش در حافظه در نظر گرفته می شه و از چه نوعی و اصلا کدوم بخش از حافظه قرار می گیره؟
2 - فکر می کنم که توابع عضو قبل از کامپایل درون حافظه قرار بگیرند و وجه تمایز اون ها هم حین ساخت شی ، اشاره گر this هست، این توابع به چه نحوی درون حافظه قرار می گیرند که کامپایلر می فهمه این یک تابع عضو فلان کلاس هست نه یک تابع مستقل؟
3 - چرا وقتی یک کلاس را قبل از ساخت یک شی ازش sizeof می گیریم، اندازه ای برابر با اندازه نوع متغیر ها به ما می ده، مگه نگفتیم تا شی ای ساخته نشه، برای متغیرهای عضو فضایی در نظر گرفته نمی شه ؟ مگر توابع عضو قبل از ساخت شی و حین کامپایل در حافظه قرار نمی گیرند، پس چرا اندازه اون ها، همراه با اندازه کلاس و با دستور sizeof بر گردونده نمی شه؟

class A
{
public:
A() {std::cout << "ConstructorA is run.";}

double func(int x=1){return x;}

private:
int var1;
int var2;
int var3;

};
void main() {
std::cout << sizeof(A);
}


output is : 12

stackprogramer
شنبه 16 خرداد 1394, 15:56 عصر
درود درجواب این سوالت اول ودومت ، توابع قبل از فراخوانی و حین کامپایل درون حافظه قرار می گیرند، پس مثلا یه تابعی که از نوع برگشتی double استفاده کرده، قبل از فراخوانی 8 بایت براش در نظر گرفته میشه، اما دستورات تابع و متغیر های محلی تابع هم که تا تابع صدا زده نشه، ساخته نمی شن، پس این متغیرهای محلی و دستورات تابع، قبل از فراخوانی تابع و حین کامپایل به چه صورتی همراه تابع قرار می گیرند؟؟ فکر نمی کنم در اون فضای 8 بایتی قرار بگیرند، پس کجا و به چه صورت ذخیره می شن که حافظه ای رو نمی گیرند ولی هستند؟؟؟

دوست عزیز اینکه باید بدونی در واقع تمام این ها داخل بخش های از حافظه برنامه اجرایی به نام سگمنت ها ذخیره می شوند،سگمنت چند نوع داشتیم،سگمنت کد،سگمنت داده،سگمنت استک،سگمنت اضافی،پس این حرف که این ها ساخته نمی شوند حرف کاملا درستی نیست درون سگمنت ها تمام این دستورات بارگذاری می شود اینکه می گن این دستورات ساخته نمی شوند،منظور این نیست که در حافظه فایل اجرایی ذخیره نشده،یعنی وقتی که تو فایل اجرایی را زدی،تابع مین شروع می کنه به ران شدن،وقتی به اون تابع یا کلاس احتیاج پیدا کرد،اون را فرا می خونه،دستورات و داده های تابع داخل سگمنت کد ودیتا قرار داره،از اونجا اون ها هم بر می داره،پس تو نباید از دید سی پلاس پلاس به مدیریت حافظه نگاه کنی،باید از دید اسمبلی با حافظه برخود کنی وگرنه ادمو خیلی گیج می شه


در مورد دستور sizeof هم توباید ببینی فلسفه این دستور چی است،یک مثال می زنم تا حالا دستور movاسمبلی شنیدی،این دستور اصلا برای کامپیوتر قابل فهم نیست،باید باینری اش به کامپیوتر بدی،تو معماری متفاوت این دستور فرق می کنه،اما به طور معمول سه بایت است،دستور int به خاطر بردار های و ای دی وفقه بیشتر،ممکن این دو تابع هم داده های داشته باشند ولی تابع sizeof اندازه بایت شده می ده ،نه داده ها و رشته های مربوط به اون



توصیه اخر اگر بادید سخت افزاری بخوای نگاه کنی از زوایه اسمبلی به مسایل نگاه کن،چون خود سی هم با اسمبلی نوشتن مگه غیز از اینه،امیدوارم منظورم را خوب بیان کرده باشم:عصبانی++:

chikar
شنبه 16 خرداد 1394, 16:33 عصر
امیدوارم منظورم را خوب بیان کرده باشم:عصبانی++:
دوست عزیز، شما متاسفانه با این همه تفصیلی که تو توضیح سوال دادم، اصل سوال من رو نفهمیدید!!!:قهقهه:
من سگمنت های حافظه رو تا حدودی می شناسم و منظورم از ساخته نشدن، این نبود که این دستورات در سگمنت قرار نمی گیرند، این بود که به دستوری مثل int n که در یک تابع به عنوان متغیر محلی به حساب میاد، تا زمانی که تابع صدا زده نشه، حافظه ای برای اون در نظر گرفته نمی شه، نه اینکه خود دستور ساخته نشه، من منظورم این بود که خود این دستور در کجای همون سگمنت قرار می گیره، یعنی مثلا double رو 8 بایت جدا یه جا ذخیره می کنه و دستورات محلی تابع رو یه جای دیگه؟خب کجا؟ خب برای این دستورات چه مقدار حافظه در نظر می گیره؟چه طوری فراخونی می شن؟ چطوری می فهمن که مال کدوم تابع است؟

در مورد sizeof هم فکر کنم منظورم این نبود!! صورت سوال مربوط رو با دقت بخونید متوجه می شید:چشمک:

ولی این نکته رو قبول دارم که باید به قول شما از دید اسمبلی به حافظه نگاه کنی تا سی!
بابت پاسختون تشکر :تشویق:

stackprogramer
شنبه 16 خرداد 1394, 21:58 عصر
نظرشما درست ولی اگه یک بار دیگه جوابم را بخونی،می بینی درست جواب دادم،شک ندارم،دقیق تر بخون،ولی اضافه کنم تابع وکلاس ،اینکه کجای سگمنت است،؟!وقتی به این سوال رسیدی،تابع وکلاس،اگه داخل برنامه باشه،یعنی کلا یک فایل exe درست کنی،ِDLLاستفاده نکنی،مثل تابع ADD یک بخش مثل اینه که مثل ماکرو پیاده بشه هر جای تابع،که فراخونی شد یک نسخه از ان کپی شه،بعد ان اگه به صورت تابع ذخیره بشه،به صورت callوreturn در اسمبلی پیاده می شه،تابع داخل سگمنت اضافی تعریف شده،با call می ره به اون ادرس با ret برمی گرده،به جای اولش به همین راحتی،:قهقهه:
ولی پروفسور زیاد به کله فشار نیار،عجب فکر هایی می کنی!!!!!!!!!!!:چشمک:ما ها فقط فکر می کنیم همه چیز بلدیم،ولی همه چیزها را سطحی تو دانشگاه ها گفتند،چون هیچوقت سوال ها اینجوری نباید می داشتیم

pbm_soy
یک شنبه 17 خرداد 1394, 03:17 صبح
پرسیدن چنین سوالاتی خوب است و دید برنامه نویس را نسبت به نحوه اجرا شدن برنامه ها باز میکند با دانستن چنین اطلاعاتی میتوانید برید سراغ مباحث دیباگ کردن برنامه ها و کرک کردنشون و خیلی موارد دیگر!
موردی که در نوشته های شما دوستان عزیز دیدم این بود که هردو گفتید "توابع و برنامه حین کامپایل درون حافظه قرار میگیرد"! این مورد صحیح نیست!
اگر بخواهیم به زبان ساده بگیم کامپایل مرحله یا عملیاتی است که برنامه شما را ترجمه میکند به زبان ماشین (که آن هم دو مرحله است مرحله ساخت OBJ و سپس لینک کردن و ساخت exe)
در زمان کامپایل برنامه ، برنامه شما به حافظه لود نمیشود چون قرار نیست اجرا شود (اگر لود هم شود صرفا برای ترجمه) در این مرحله دستورات برنامه شما تبدیل به کدها و یا دستورات زبان ماشین میشود (و سپس با فایلهای لایبرراری دیگر نیز لینک میشود و همینطور آدرس دهی ها هم به آدرسهای صحیح و نسبی تبدیل میشوند)

pbm_soy
یک شنبه 17 خرداد 1394, 04:00 صبح
در مورد اشغال حافظه هم باید به این موضوع توجه کنیم که برنامه چطوری اجرا میشود و مسول اجرا کردن کیست یا چیست؟
پس از اینکه از برنامه یک فایل اجرائی ساخته شد (در ویندوز EXE) و در خواست اجرا کردن آن از طرف کاربر به ویندوز داده میشود (حالا اگر در محیط برنامه نویسی باشیم میگیم کامپایل و اجرا کن)
در هرصورت کاربر درخواست اجرا به ویندوز میدهد حال ویندوز دستورات زبان ماشین را از فایل exe به حافظه لود میکند (این عملیات هم بسته به نوع و ساختار فایل کمی متفاوت هستند) ولی درکل برای یک برنامه سگمنتهای حافظه که دوست عزیزمون قبلا گفتن ساخته میشود (در واقع بخشهایی از حافظه برای این منظور جدا میشوند) ودر هر کدام بخشهایی از برنامه لود میشوند
* code segment در این بخش دستورات برنامه لود میشوند
* data segment در این بخش داده های برنامه لود میشوند (داده های ثابت تعریف شده نه ماکروها و متغییرهای برنامه نیز در این بخش قرار میگیرند و حتی اشیاء ساخته شده از کلاسها)
* stack segment این بخش هم رزرو میشود تا در آِنده از آنها استفاده شوند (برای نگهداری آدرس برگشت از زیربرنامه ها و توابع و برای فرستادن پارامتر یا آرگومان به داخل زیربرنامه ها و موارد دیگر)
* extra segment بخش اضافی حافظه

نمیخوام زیاد بحث را باز کنم (فرصت کمه) می توانید به کتاب مراجعه کنید ولی سعی میکنم خیلی کوتاه اینجا بگم
* در بخش کدسگمنت فقط دستورات برنامه بارگذاری میشوند (main و دیگر توابع حالا این توابع آزاد باشند و یا تحت یک کلاس باشند فرقی نمیکنند) و اینکه هر دستور چقدر حافظه اشغال میکند این بحث دیگری است. بسته به نوع کامپایلر و زبان برنامه نویسی ممکن است یک دستور زبان سطح بالا به یک یا چند دستور معادل زبان ماشین تبدیل شود و آن دستور زبان ماشین درنهایت حافظه اشغال میکند!
* در بخش دیتاسگمنت متغییرهای برنامه و داده های برنامه قرار میگیرند وقتی متغییری را تعریف میکنید آن متغییر در این ناحیه از حافظه فضا را اشغال میکند و داده را در آن محل نگهداری میکند

** درمورد سوال اول مقادیر برگشتی از توابع و مقادیر ورودی (آرگومانهای ورودی) به تابع از طریق stack segment به دو بخش از برنامه پاس داده میشوند و دستورات خود برنامه در بخش دیتا سگمنت قرار میگیرند به عنوان مثال آن تابعی که نوشته بودید

double func(int x=1){return x;}

این تابع شاید به چندین دستور معادل زبان ماشین تبدیل شود

* میتوان سوال 2 و3 را باهم جواب داد اولا همون sizeof خیلی از مسائل را روشن میکند چون میزان فضایی که قرار است توسط (متغییرهای عضو) یک شئ اشغال شود را میگوید
دقت کنید اولین موردی که گفته میشود اینه که یک کلاس هیچ فضایی را اشغال نمیکند زمانی فضای حافظه را اشغال میکند که یک شئ از آن کلاس تعریف کنیم یعنی اگر در برنامه چنین نوشته باشیم myClass test; در واقع وقتی این دستور معادلهای ماشینش در کدسگمنت قراردارد و وقتی آنها اجرا میشوند خانه های حافظه برای آن شئ در دیتاسگمنت گرفته میشوند و حالاست که حافظه اشغال میشود و حالاست که اگر شما بگید آدرس test چیست؟ یک آدرس حافظه برای شما نمایش خواهد داد که از بخش دیتاسگمنت است
ولی اگر بگید آدرس کلاس myClassرا بده کلا خطا میگیرد و برنامه قابل ترجمه به زبان ماشین نمیشود چون معادلی ندارد! چون کلاس فضایی از حافظه دیتاسگمنت را اشغال نکرده است ولی سوالی که پیش میاد اینه که پس توابع و ستورات حافظه اشغال نمیکنند؟ در جواب چرا اشغال میکنند و آن فضا در ناحیه کدسگمنت است و نیازی به آدرس آن ناحیه نداریم
* البته یک استثنا هم وجود دارد آنهم متغییرهای static هستند فرقی نمیکنه چه در داخل کلاس باشد چه مستقل یک خانه حافظه مستقل و منحصر به فرد و ایستا و پایا برای خود دارد و معمولا آنرا از دست نمیدهند
* هرچند جواب سوال سوم داده شد ولی باز اینجا میگم هردو دستور زیر درست است

myClass test;
cout<< sizeof(myClass);

cout<< sizeof(test);

chikar
یک شنبه 17 خرداد 1394, 22:41 عصر
ولی پروفسور زیاد به کله فشار نیار،عجب فکر هایی می کنی!!!!!!!!!!!:چشمک:ما ها فقط فکر می کنیم همه چیز بلدیم،ولی همه چیزها را سطحی تو دانشگاه ها گفتند،چون هیچوقت سوال ها اینجوری نباید می داشتیم
این چه طرز حرف زدن دوست عزیز!!!!!!!
من کی گفتم همه چی بلدم یا از کجا فهمیدید که ما ها همچین فکری می کنیم؟؟!!، من اگر همه چیز بلد بودم که تاپیک نمی زدم و سوال نمی پرسیدم!
چی شما رو اینقدر دلخور کرده؟؟؟؟؟
جواب بی ارزش شمردن و سطحی دونستن این سوال رو هم دوستمون در پست بعدی دادن بفرمایید بخونید :


پرسیدن چنین سوالاتی خوب است و دید برنامه نویس را نسبت به نحوه اجرا شدن برنامه ها باز میکند با دانستن چنین اطلاعاتی میتوانید برید سراغ مباحث دیباگ کردن برنامه ها و کرک کردنشون و خیلی موارد دیگر!

chikar
یک شنبه 17 خرداد 1394, 22:51 عصر
در کل خیلی خوب بود http://barnamenevis.org/images/smilies/yahoo/131.gif / مرسی



مقادیر برگشتی از توابع و مقادیر ورودی (آرگومانهای ورودی) به تابع از طریق stack segment به دو بخش از برنامه پاس داده میشوند و دستورات خود برنامه در بخش دیتا سگمنت قرار میگیرند به عنوان مثال آن تابعی که نوشته بودید


طیق تعریف ویکی پدیا از دیتا سگمنت و بخش های دیگه حافظه در این لینک (http://en.wikipedia.org/wiki/Data_segment)، باید گفت که متغیر های محلی و پارامتر های ورودی یک تابع هر دو در استک قرار می گیرند و نه اینکه پارامتر ورودی تابع در استک و متغیر های محلی اون در دیتا سگمنت!(در مثال زیر هم x و هم y در استک قرار می گیرند، همچنین اگر به فرض متغیری به این شکل در تابع main نیز تعریف شده باشه، اون هم در استک قرار می گیره درسته؟)

void myfunc(int x=0)
{
int y= 5;
}


دستورات تابع هم مگه نفرمودید که در بخش کد قرار می گیره؟ پس منظورتون از دستورات درون دیتا سگمنت قرار می گیره کدام دستورات هست؟

سوال 1)خب بیان شد که موقع کامپایل همه کدها به دستورات قابل فهم ماشین تبدیل می شن و موقع اجرا براساس این دستورات فضایی در حافظه برای اون ها در نظر گرفته می شه و روشن شد که خود تابع قبل از فراخوانی در حافظه قرار گرفته(حین اجرا)، حالا سوال اینجاست که آیا مفهوم ذخیره شدن یک تابع در text segment، این هست که یک تابع با تمام دستوراتش(دستورات زبان ماشین) در اونجا قرار می گیره؟شما گفتید این دستورات خودشون می تونند حافظه ای رو بگیرند، پس حافظه ای که نوع برگشتی یک تابع می ده، مثلا double هست و 8 بایت رو گرفته، پس این 8 بایت چی می شه، یعنی دستورات داخل 8 بایت قرار می گیرند، یا نه ؟اصلا کاربرد این 8 بایت چی میشه؟
ببینید من با نحوه ذخیره شدن و مکان این executable instructions در text segment مشکل دارم، نمی تونم درست بفهممش ، چون اسمبلی کار نکردم!!

سوال 2)یه سوال دیگه چرا متغیر های محلی تابع ، بعد ازاتمام تابع از استک حذف می شن، ولی متغیر های محلی تابع main، تا پایان برنامه در استک باقی می مونند؟با وجودی که هم توابع مستقل و هم تابع main هر دو در text segment قرار دارند؟

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

pbm_soy
دوشنبه 18 خرداد 1394, 02:06 صبح
نمیدونم کجا گفتم که دستورات در دیتاسگمنت قرار میگیرند؟! اگه گفتم اشتباه شده! در کل تمام دستورات در کدسگمنت قرار میگیرند (منظورم دستورات است نه دادهها و نه دستوراتی که دادها را تعریف میکنند )
منظور شما از text segment چیست؟ چنین چیزی را من ندیدم! کجا خواندید؟ لینک بدید بررسی کنیم (فعلا من اینجا text segment را همون code segment فرض میکنم)

* سوال سوم : توابع شما در دیتا سگمنت قرار میگیرند (بله قابل دسترسی خواهند بود تحت شرایطی) چون در هر صورت در حافظه هستند (بحث اشاره گر به توابع را مطالعه کنید)
* سوال دوم: خوب قانون اینه که متغییرهای محلی که در تابع تعریف میشوند وقتی اجرای آن تابع تمام شد آن متغییرها هم از بین بروند چون دیگر نیازی به آن متغییرها نیست (تنها دستوراتی که به آنها دسترسی داشتند دستورات تابع بود که آنهم اجرا شده و تمام شده!)
بله متغییرهای تعریف شده در main تا پایان اجرای برنامه باقی میمانند
به این نکته توجه کنید وقتی اجرای یک تابع به اتمام میرسد و کنترل اجرای برنامه از آن تابع خارج میشود فقط متغییرهای محلی آن از حافظه از بین میروند ولی دستورات خود تابع در حافظه هنوز محفوظ است (برای فراخوانیهای آتی و غیره)
* سوال یکم : بله تمام دستورات برنامه هنگام اجرا به حافظه لود میشوند (بجز DLLها که بحث دیگری است)
** عبارت نادرست --->>> اگر نوع برگشتی یک تابع 8 بایتی باشد پس دستورات آن تابع 8 بایت فضا اشغال میکند
امیزان فضای اشغالی توسط دستورات تابع ربطی به نوع مقدار برگشتی آن ندارد.! مقدار برگشتی صرفا یک مقدار است که از طریق Stack به محل فرخوانی برگشت داده میشود در اینجا آن 8 بایتی که گفتید صرفا وقتی کنترل اجرای برنامه به دستور return میرسد و آن اجرا میشود مقدار برگشتی در خانه stack گذاشته میشود (البته ابتدا آدر برگشت از stack خوانده میشود و بعد مقدار برگشتی در stack گذاشته میشود)

pbm_soy
دوشنبه 18 خرداد 1394, 02:17 صبح
تصویر زیر یک تصویر مفهومی از نحوه لود شدن برنامه های c/c++ در حافظه است (مفهومی است نه فیزیکی )
از کتاب c++ from ground up از هربرت شیلد که کتابهای فوق العاده ای برای زبانهای خانواده سی و جاوا از قدیم مینویسند شاید حدود بیشتر از 20 عنوان کتاب در این زمینه دارند (که هر کدام جایگاه خاصی دارند)

132037

در اینجا heap را به عنوان محل داده های پویا (dynamic) معرفی کرده است!

chikar
دوشنبه 18 خرداد 1394, 22:48 عصر
منظور شما از text segment چیست؟ چنین چیزی را من ندیدم! کجا خواندید؟ لینک بدید بررسی کنیم (فعلا من اینجا text segment را همون code segment فرض میکنم)

بله منظورم همون بود، code segment رو text segment و حتی text. نیز می شناسند، منبع در این لینک (http://en.wikipedia.org/wiki/Code_segment)

تشکر فراوان از شما /:تشویق:
1) ببینید گفتیم تابع حین کامپایل به دستورات ماشین تبدیل می شه و همچینین در مرحله اجرا، این دستورات درون کد سگمنت قرار می گیرند، وقتی تابع فراخوانی می شه، با مراجعه به آدرس همین دستورات ماشین مختص تابع در بخش کد سگمنت این تابع اجرا می شه، درسته ؟

2) گفتیم کلاس تا شی ای ازش ساخته نشه، آدرسی نداره و حافظه ای نمی گیره، به نظر منطقی می رسه، ولی منطقی نیست که بشه قبل از ساخت یک شی مثلا با استفاده از اشاره گر به یک تابع عضو ، یک تابع عضو رو اجرا کرد، خب اگر اجرا بشه، برای کدوم شی اجرا شده؟ اگرم بگید که اشاره گر به یک تابع عضو، تابع رو اجرا نمی کنه و فقط آدرسش رو بر می گردونه، باید بگم این چه سودی داره؟ (آدرس هم نمی ده، true و false بر می گردونه)

3) دستورات خود کلاس مثل تعریف کلاس و ...هم درون کد سگمنت قرار می گیره؟ و حافظه ای رو هم اشغال می کنه دیگه؟

pbm_soy
دوشنبه 18 خرداد 1394, 23:27 عصر
جواب سوال اول مثبت است
در مورد سوال دوم دستورات توابع عضو کلاس در زمان اجرای برنامه به کدسگمنت لود میشوند و وقتی شئ از آن ایجاد میشود فضای حافظه برای متغییرهای آن اشغال میشود
در مورد اجرا کردن توابع عضو یک کلاس قبل از ایجاد شئ هم فقط برای توابع نوع static این امکان وجود دارد

من پیشنهاد میکنم یک کتاب خوب را از پایه مطالعه کنید مخصوصا برای بحث اشاره گر به تابع یادم میاد کتاب C++ نوشته رابرت لی فور ترجمه قلزم (2 جلدی) در زمینه مفاهیم و کاربرد فوق العاده بود

pbm_soy
دوشنبه 18 خرداد 1394, 23:52 عصر
اینم چندتا لینک که بد نیستند

http://www.firmcodes.com/memory-layout-c-program-2/
http://www.geeksforgeeks.org/memory-layout-of-c-program/
http://www.tenouk.com/ModuleZ.html
http://www.tenouk.com/ModuleW.html
https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=9&ved=0CFsQFjAI&url=http%3A%2F%2Fwww.inf.udec.cl%2F~leo%2FteoX.pdf&ei=ofR1VbyYIcKvsQHu2IOoBA&usg=AFQjCNEjJoLu3aU8KoH5nUtBdkAzNOL5RA&sig2=C2s4rZcGJXbk2tla-aC9-g&bvm=bv.95039771,d.bGg&cad=rja

chikar
پنج شنبه 21 خرداد 1394, 19:16 عصر
خب مرسی تا اینجا
فقط می مونه بحث این dll ها!
فرض کنید داخل یک dll تعدادی مثل 50 تا سورس فایل که در هر کدوم از اون ها تعدادی کلاس و تابع تعریف شده داریم، همچنین ما یه هدر فایل جدای از این dll داریم، خب سوالات
1) زمانی که روی یک .exe دابل کلیک میشود، کل دستورات در کد سگمنت بارگذاری می شود، آیا include کردن هدر یک dll و استفاده از dll هم به همین گونه است؟
1) صرفا include کردن هدر فایل مربوط به dll ، آیا باعث لود شدن کل فایل های dll در حافظه می شه؟
2) اگر فقط نیاز ما به یک تابع از کل فایل های درون dll باشد، آیا باز هم کل سورس های dll در حافظه بارگذاری می شود؟

pbm_soy
شنبه 23 خرداد 1394, 00:07 صبح
تا اونجائی که من میدانم فایلهای .h و .lib در زمان کامپایل در مرحله لینک کردن به فایل exe میچسباند ولی فایلهای dll اینگونه نیستند و باید در کنار فایل exe باشد و یا در فولدر system32 ویندوز باید باشد تا توسط دستورات هر کدام از توابع مورد نیاز در برنامه فقط آن تابع لود و استفاده میشود
DLL در واقع Dynamic Link Library است

توجه داشته باشید که dllها هم دقیقا مانند فایلهای exe هستند بخش کد و دیتا دارند ولی بخش کد که به حافظه لود میشود معمولا در اختیار تمام پراسسهای دیگر قرار میگیرند ولی معمولا بخش دیتا بصورت خصوصی برای هر پراسس جدا است (البته این موارد هم استثنات خودشان را دارند)
https://en.wikipedia.org/wiki/Dynamic-link_library
http://www.willus.com/mingw/colinp/win32/dll/intro.html