سروش ربیعی
یک شنبه 15 اسفند 1389, 22:30 عصر
سلام
کسی میتونه کد زیر رو برام توضیح بده؟ این کد رو صرفاً برای این نوشتم که بفهمم اختصاص حافظه تو توابع بازگشتی به چه شکلی هست.
خوب ما میدونیم که رفتار متغیرهای استاتیک در فراخوانیهای بازگشتی توی استاندارد سیپلاسپلاس طبقهبندی <نامشخص> (<unspecified>) داره. یعنی تعیین ترتیب ارزیابی برعهدهٔ کامپایلر هست و استاندارد استفاده از این کد رو توصیه نمیکنه. بنابراین برنامهنویس نباید انتظار داشته باشه خروجی رو حساب خاصی تولید بشه.
خروجیهای برنامه توی g++ ، code::blocks , Borland به صورت 110, 100, 40 هست. اما خروجی توی VC++ فرق میکنه و به صورت 50, 80, 90 هست.
حالا سؤال من این هست که چرا کامپایلر VC++ با بقیهٔ کامپایلرها نتیجهٔ متفاوتی ایجاد میکنه؟ اگر فرض کنیم ترتیب ارزیابی معکوس هست باز هم جواب نادرست میشه... VC++ رو چه حسابی برای متغیرهای استاتیک توابع بازگشتی حافظه میگیره؟ من فقط میخوام تفاوت مکانیزم ایجاد و مدیریت Activation Recordها رو توی VC++ و کامپایلرهای استاندارد بدونم.
اینم کد:
#include <iostream>
using namespace std;
int f(const int& value)
{
static int result = 0;
return result += value;
}
int main()
{
cout << f(10) << ", " << f(f(10)) << ", " << f(f(f(10)));
return 0;
}
کسی میتونه کد زیر رو برام توضیح بده؟ این کد رو صرفاً برای این نوشتم که بفهمم اختصاص حافظه تو توابع بازگشتی به چه شکلی هست.
خوب ما میدونیم که رفتار متغیرهای استاتیک در فراخوانیهای بازگشتی توی استاندارد سیپلاسپلاس طبقهبندی <نامشخص> (<unspecified>) داره. یعنی تعیین ترتیب ارزیابی برعهدهٔ کامپایلر هست و استاندارد استفاده از این کد رو توصیه نمیکنه. بنابراین برنامهنویس نباید انتظار داشته باشه خروجی رو حساب خاصی تولید بشه.
خروجیهای برنامه توی g++ ، code::blocks , Borland به صورت 110, 100, 40 هست. اما خروجی توی VC++ فرق میکنه و به صورت 50, 80, 90 هست.
حالا سؤال من این هست که چرا کامپایلر VC++ با بقیهٔ کامپایلرها نتیجهٔ متفاوتی ایجاد میکنه؟ اگر فرض کنیم ترتیب ارزیابی معکوس هست باز هم جواب نادرست میشه... VC++ رو چه حسابی برای متغیرهای استاتیک توابع بازگشتی حافظه میگیره؟ من فقط میخوام تفاوت مکانیزم ایجاد و مدیریت Activation Recordها رو توی VC++ و کامپایلرهای استاندارد بدونم.
اینم کد:
#include <iostream>
using namespace std;
int f(const int& value)
{
static int result = 0;
return result += value;
}
int main()
{
cout << f(10) << ", " << f(f(10)) << ", " << f(f(f(10)));
return 0;
}