اطلاعیه

Collapse
No announcement yet.

متغیر محلی با کلاس static طول عمر متغیر global رو داره؟

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    متغیر محلی با کلاس static طول عمر متغیر global رو داره؟

    سلام
    آیا متغیر محلی که با کلاس static معرفی میشه، طول عمر متغیر global رو داره؟ یعنی ram رو تا آخر اشغال میکنه؟؟

    #2
    پاسخ : متغیر محلی با کلاس static طول عمر متغیر global رو داره؟

    با توجه به اینکه بعد از پایان یافتن کار تابع ؛ متغیر استاتیک از بین نمیره باید یه جایی ذخیره شده باشه یعنی حافظه میگیره. (فرقشم با متغیر عمومی اینه که فقط در همون تابع قابل استفاده است)

    دیدگاه


      #3
      پاسخ : متغیر محلی با کلاس static طول عمر متغیر global رو داره؟

      نوشته اصلی توسط mojalan
      با توجه به اینکه بعد از پایان یافتن کار تابع ؛ متغیر استاتیک از بین نمیره باید یه جایی ذخیره شده باشه یعنی حافظه میگیره. (فرقشم با متغیر عمومی اینه که فقط در همون تابع قابل استفاده است)
      با این حساب مثل متغیر عمومیه فقط با این فرق که فقط تو همون تابع کاربرد داره
      میشه بطور قطعی همین باشه؟

      دیدگاه


        #4
        پاسخ : متغیر محلی با کلاس static طول عمر متغیر global رو داره؟

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

        دیدگاه


          #5
          پاسخ : متغیر محلی با کلاس static طول عمر متغیر global رو داره؟

          یعنی کسی جواب این سوال رو نمیدونه؟

          دیدگاه


            #6
            پاسخ : متغیر محلی با کلاس static طول عمر متغیر global رو داره؟

            با سلام
            سوالتون یک کم گنگ هستش.
            اگر بیشتر توضیح بدین یا واضحتر بگین
            http://imenbazar.com

            دیدگاه


              #7
              پاسخ : متغیر محلی با کلاس static طول عمر متغیر global رو داره؟

              منظور از متغیر محلی اینه که فقط درتابع تعریف شده شناخته میشود و در توابع دیگر قابل استفاده نیست متغیرهایی که در main تعریف میشوند بایستی در بیرون ناشناخته باشند برای همین محلی هستند

              دیدگاه


                #8
                پاسخ : متغیر محلی با کلاس static طول عمر متغیر global رو داره؟

                نوشته اصلی توسط mohammad751
                منظور از متغیر محلی اینه که فقط درتابع تعریف شده شناخته میشود و در توابع دیگر قابل استفاده نیست متغیرهایی که در main تعریف میشوند بایستی در بیرون ناشناخته باشند برای همین محلی هستند
                متغیری که در تابع main بصورت کلاس حافظه اتوماتیک تعریف میشه(همون تعریف معمولی)، چون تابع main که توسط تابعی فراخوانی نمیشه و فقط یکبار اجرا میشه و وارد یک حلقه میشیم(برای firmware) ، متغیرهایی که در تابع main تعریف میشن، چه حالتی دارن؟ مقادیرشون تا آخر باقی میمونه؟

                دیدگاه


                  #9
                  پاسخ : متغیر محلی با کلاس static طول عمر متغیر global رو داره؟

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

                  دیدگاه


                    #10
                    پاسخ : متغیر محلی با کلاس static طول عمر متغیر global رو داره؟

                    نوشته اصلی توسط مرجان کهندل
                    متغیری که در تابع main بصورت کلاس حافظه اتوماتیک تعریف میشه(همون تعریف معمولی)، چون تابع main که توسط تابعی فراخوانی نمیشه و فقط یکبار اجرا میشه و وارد یک حلقه میشیم(برای firmware) ، متغیرهایی که در تابع main تعریف میشن، چه حالتی دارن؟ مقادیرشون تا آخر باقی میمونه؟
                    اشتباه فکر میکنید. تابع main هم فراخوانی میشه. اما این فراخوانی رو شما هیچ وقت تو خود C نمیبینید. علتش هم اینه که وقتی برنامه تون داره کامپایل میشه یک سری برنامه اسمبلی توسط خود کامپایلر به برنامه اصلی اضافه میشن. اینها مقادیر اولیه متغیرهای استاتیک و ... رو اینیشیال میکنن به علاوه اینکه تابع main هم توسط همین برنامه های اسمبلی فراخوانی میشه.

                    اما قسمت دوم سوالتون.
                    کلا متغیرها چه استاتیک و چه گلوبال و چه لوکال، همیشه روی رم هستن. فرقی نمیکنه متغیر چه طور تعریف میشه. حتی اگر یک تابعی فقط یک بار فراخوانی بشه و درون خودش یک آرایه داشته باشه این آرایه از اول برنامه تا آخر روی رم هست. حتی وقتی که تابع شما اجرا نمیشه یا اجراش تموم شده.
                    اگر میخواید مقادیر هنگام نیاز گرفته بشن و بعد که کارتون باهاشون تموم شد از حافظه پاک شن و دیگه رزیدنت نباشن روی رم باید از Dynamic memory استفاده کنید.
                    دستورات new, delete این کار رو میکنن.
                    جدای از این ها کتابخونه های دیگری هم هستن که حافظه رو به صورت داینامیک براتون مدیریت میکنن.

                    دیدگاه


                      #11
                      پاسخ : متغیر محلی با کلاس static طول عمر متغیر global رو داره؟

                      شتباه فکر میکنید. تابع main هم فراخوانی میشه. اما این فراخوانی رو شما هیچ وقت تو خود C نمیبینید. علتش هم اینه که وقتی برنامه تون داره کامپایل میشه یک سری برنامه اسمبلی توسط خود کامپایلر به برنامه اصلی اضافه میشن. اینها مقادیر اولیه متغیرهای استاتیک و ... رو اینیشیال میکنن به علاوه اینکه تابع main هم توسط همین برنامه های اسمبلی فراخوانی میشه.

                      اما قسمت دوم سوالتون.
                      کلا متغیرها چه استاتیک و چه گلوبال و چه لوکال، همیشه روی رم هستن. فرقی نمیکنه متغیر چه طور تعریف میشه. حتی اگر یک تابعی فقط یک بار فراخوانی بشه و درون خودش یک آرایه داشته باشه این آرایه از اول برنامه تا آخر روی رم هست. حتی وقتی که تابع شما اجرا نمیشه یا اجراش تموم شده.
                      اگر میخواید مقادیر هنگام نیاز گرفته بشن و بعد که کارتون باهاشون تموم شد از حافظه پاک شن و دیگه رزیدنت نباشن روی رم باید از Dynamic memory استفاده کنید.
                      دستورات new, delete این کار رو میکنن.
                      جدای از این ها کتابخونه های دیگری هم هستن که حافظه رو به صورت داینامیک براتون مدیریت میکنن.
                      سلام
                      من با نظر شما موافق نیستم دوست عزیز.
                      متغیری که داخل یک تابع تعریف می شود متغیر لوکال بوده و طول عمر آن تا لحظه اجرای تابع است و پس از برگشت از تابع حافظه اختصاص داده شده به آن آزاد می شود.
                      متغیری که داخل main تعریف شود ، حافظه اختصاص داده شده به آن آزاد نمی شود ولی در داخل تابع دیگر هم قابل دسترسی نیست.
                      در صورتی که نیاز به متغیری دارید که درون همه توابع قابل دسترسی باشد باید خارج از main تعریف شود که این متغیر گلوبال می باشد.
                      سلام
                      آیا متغیر محلی که با کلاس static معرفی میشه، طول عمر متغیر global رو داره؟ یعنی ram رو تا آخر اشغال میکنه؟؟
                      بله نظر شما درست است.
                      با این حساب مثل متغیر عمومیه فقط با این فرق که فقط تو همون تابع کاربرد داره
                      میشه بطور قطعی همین باشه؟
                      این نظر شما هم درست است ، متغیر استاتیک فقط داخل همان تابعی که تعریف شود کاربرد دارد و در جایی که نیاز است مقدار یک متغیر داخل یک تابع برای فراخوانی های بعدی حفظ شود استاتیک تعریف میشود و فقط یک بار مقدار اولیه می گیرد .
                      ه سوال مهم تر که خیلی وقته ذهنمو مشغول کرده
                      ما اگه تابعی بنویسیم، اون رو در تابع main فراخوانی میکنیم. با هر بار فراخوانی مقدار متغیرهای محلی معمولی در هر تابع، به مقدار اولیش بر میگیرده. خوب خود تابع main یک تابع است و متغیر هایی که توش معرفی میکنیم محلی هستن. سوال اینجاست که تابع main که جایی فراخوانی نمیشه و خودش از اول فعال شده، تکلیف متغیرهای درون main چیه؟ مثل متغیر عمومیه ؟ هیچ وقت که به مقدار اولیه بر نمی گرده، یعنی تابع main که پشت سر هم فراخوانی نمیشه
                      تابع main به طور پی در پی فراخوانی نمیشود ، ولی اینکه مقدا یک متغیر چگونه تغییر میکند بسته به برنامه نوشته شده دارد .در زیر دو نمونه برنامه می بینید .


                      1
                      ()main
                      }
                      ;0=int i
                      .
                      .
                      .
                      ;()function

                      {


                      2

                      ()main
                      }
                      ;0=int i
                      (1)while
                      }
                      ;()function
                      .
                      .
                      .
                      {
                      {

                      در برنامه 1 هر بار که تابع function اجرا شود پس از برگشت از تابع متغیر i مقدا اولیه صفر می گیرد و لی در برنامه 2 مقدار i یک مرتبه تعریف می شود و چون هیچگاه برنامه به خط قبل از حلقه while بر نمی گردد در نتیجه هیچگاه دومرتبه مقدار اولیه نمی گیرد.

                      دیدگاه


                        #12
                        پاسخ : متغیر محلی با کلاس static طول عمر متغیر global رو داره؟

                        نوشته اصلی توسط naser_y
                        سلام
                        من با نظر شما موافق نیستم دوست عزیز.
                        متغیری که داخل یک تابع تعریف می شود متغیر لوکال بوده و طول عمر آن تا لحظه اجرای تابع است و پس از برگشت از تابع حافظه اختصاص داده شده به آن آزاد می شود.
                        متغیری که داخل main تعریف شود ، حافظه اختصاص داده شده به آن آزاد نمی شود ولی در داخل تابع دیگر هم قابل دسترسی نیست.
                        در صورتی که نیاز به متغیری دارید که درون همه توابع قابل دسترسی باشد باید خارج از main تعریف شود که این متغیر گلوبال می باشد.بله نظر شما درست است.این نظر شما هم درست است ، متغیر استاتیک فقط داخل همان تابعی که تعریف شود کاربرد دارد و در جایی که نیاز است مقدار یک متغیر داخل یک تابع برای فراخوانی های بعدی حفظ شود استاتیک تعریف میشود و فقط یک بار مقدار اولیه می گیرد .تابع main به طور پی در پی فراخوانی نمیشود ، ولی اینکه مقدا یک متغیر چگونه تغییر میکند بسته به برنامه نوشته شده دارد .در زیر دو نمونه برنامه می بینید .


                        1
                        ()main
                        }
                        ;0=int i
                        .
                        .
                        .
                        ;()function

                        {


                        2

                        ()main
                        }
                        ;0=int i
                        (1)while
                        }
                        ;()function
                        .
                        .
                        .
                        {
                        {

                        در برنامه 1 هر بار که تابع function اجرا شود پس از برگشت از تابع متغیر i مقدا اولیه صفر می گیرد و لی در برنامه 2 مقدار i یک مرتبه تعریف می شود و چون هیچگاه برنامه به خط قبل از حلقه while بر نمی گردد در نتیجه هیچگاه دومرتبه مقدار اولیه نمی گیرد.
                        این دفعه دومیه که پستم رو ویرایش میکنم چون جوابی که داده بودم خیلی خوب نبود.
                        ببینید سوالی که ایشون پرسیدند یک مقداری ابهام داره.
                        اگر منظور از طول عمر، Scope باشه حرف شما کاملا درسته اما ایشون یک جایی پرسیدند که آیا متغیرها از روی رم حذف میشن؟
                        ببینید این مسیله کاملا به معماری پردازنده مربوط میشه. این جواب مخصوص IA32 هستش.
                        اصلا مهم نیست متغیر لوکال باشه یا گلویال. متغیر هر جایی لازم باشه روی رم رزیدنته و بیرون هم نمیره. فقط چند تا استثنای کوچیک وجود داره. بقیه میمونن روی رم. فقط نوع دسترسی بهشون باهم فرق داره. مثلا یک متغیر لوکال فقط از درون همون تابعی که تعریف میکنش قابل دسترسی است. اما این متغیر اگر رجیستر کافی درون پردازنده نباشه روی رم میمونه هر چند که بقیه بهش دسترسی ندارن حتی اگر تابعی که تعریفش کرده دیگه اجرا نشه. این متغیر همچنان هست روی رم.
                        شاید از خودتون بپرسید پس لوکال اصلا چرا وجود داره؟ ببینید متغیر هایی با اسکوپ لوکال برای این تعریف میشن که توی توابع مختلف اگر یک اسم مشترک استفاده شد مشکلی به وجود نیاد و شما مثلا مجبور نباشید متغیر x رو در هر تابعی به یک شکل تعریف کنید. بحث اسکوپ فقط همینه.
                        ولی متغیر ها حتی از نوع لوکال میتونن روی رم بمونن. دلیلش هم اینه که پردازنده به اندازه کافی رجیستر نداره که کامپایلر بتونه همه متغیرها رو روی رجیستر بذاره. مخصوصا پردازنده های ia32. برای همین هم کامپایلر مجبور میشه اکثر متغیرها رو حتی اگر لوکال هستن بذاره روی رم برای اینکه جای کافی تو خود پردازنده نیست.
                        البته از زمانی که ia64 ابداع شد C++ خیلی بهتر رفتار میکنه چون ۸ تا رجیستر به پردازنده اضافه شده اند. برای همین هم کامپایلر مجبور نیست همه متغیر ها رو روی رم بذاره و خود رجیستر های پردازنده به اندازه کافی جوابگو هستند. ولی خوب باز همچنان محدودیت هست و اگر تعداد متغیر ها زیاد بشه باز پردازنده مجبوره تعدادیشون رو روی رم ببره و وقتی جا براشون گرفته شد روی رم، دیگه حافظه اشغال شده محسوب میشه و قابل استفاده مجدد نیست.
                        در کل در معماری IA32 متغیرها در اکثر مواقع روی رم میمونن. حتی اگر به صورت کاملا مقطعی استفاده بشن. ولی تو بقیه معماری ها فرق میکنه. البته خود کامپایلر هم مهمه.

                        پس در حالت کلی اصلا نمیشه گفت یک متغیر چون لوکاله پس اصلا روی رم نیست. ممکنه ۳ تا متغیر لوکال روی رم نباشند ولی ۱۰ تاشون روی رم مقیم باشن و بیرون هم نرن. این کاملا بستگی به نوع کامپایلر، نوع برنامه و ... داره.
                        یا مثلا در پردازنده های RISC خوب واضحه که کامپایلر مجبور نیست متغیر های لوکال رو روی رم ببره. رجیسترها جوابگو هستند. ولی از اونجایی که اکثر ما از معماری IA32 استفاده میکنیم، من جوابی رو دادم که به این معماری مربوط میشه.

                        دیدگاه

                        لطفا صبر کنید...
                        X