• 0
طالبة c++

[ تمت الإجابة ]ماهي الـ Storage Classes ؟

سؤال

2 إجابة على هذا السؤال .

  • 0

هذه تشير لطرق تخزين المنغيرات. هناك "النوع المؤقت" auto , وكل متغير داخل دالة إفتراضياً سيعتبره المصرف compiler من النوع auto. مثلاً لو كتبت:

#include <stdio.h>

void function(void)
{
auto int variable = 1;

printf("%d\n", variable);

variable += 1;

printf("%d\n", variable);
}

int main()
{
function();
function();

return 0;
}

فالمتيغر variable نوعه auto, وينتهي بمجرد الخروج من الدالة:

1
2
1
2

نحن نتعامل مع هذا النوع كل يوم فإفتراضياً "كل مُتغير داخل الدالة نوعه auto, بمعنى لو كتبت:

void function(void)
{
int i = 10;
}

فكأني كتبت:

void function(void)
{
auto int i = 10;
}

وهناك أيضاً "النوع الدائم" static .داخل الدوال, مثال عليه:

#include <stdio.h>

void function(void)
{
static int variable = 1;

printf("%d\n", variable);

variable += 1;

printf("%d\n", variable);
}

int main()
{
function();
function();

return 0;
}

فيه ستهيئ قيمة المتغير variable مرة واحدة فقط. مثلاً في المثال وضعنا قيمته 1:

    static int variable = 1;

لن يعيد البرنامج وضع 1 بعدها (كأن هذا السطر غير موجود), وعلى عكس auto سيحتفظ المتغير static بقيمته :

1
2
2
3

المتغيرات العامة إفتراضياً من نوع static (لكنها على عكس static مع المثال السابق يمكن رؤية المتغير العام من جميع الدوال في الملف):

#include <stdio.h>

int variable = 1;

void function(void)
{

printf("%d\n", variable);

variable += 1;

printf("%d\n", variable);
}

int main()
{
function();
function();

variable += 1;
printf("%d\n", variable);

return 0;
}

1
2
2
3
4

في هذا المثال, لو كتبت:

int variable = 1;

و :

static int variable = 1;

فكلاهما واحد.

"النوع الخارجي" extern , وفيه يكون المتغير متغير عام لكنه موجود في ملف آخر. قومي بإنشاء ملفين سمي أحدهم unit_a.cpp وآخر unit_b.cpp وضعي في الأول:

/* unit_a.cpp */

#include <stdio.h>

extern int i; /* يخبر المصرف أن المتغير متغير عام موجود في ملف آخر */

int main(int argc, char **argv)
{
printf("%d\n", i);
i++;
printf("%d\n", i);
i++;
printf("%d\n", i);

return 0;
}

وفي الملف الثاني:

/* unit_b.cpp */
#include <stdio.h>

int i = 1; /* متغير عام */

وصرفي البرنامج. لو شغلتيه سيطبع:

1
2
3

هناك أيضاً إسلوب إسمه register, مثال عليه:

#include <stdio.h>

int main(int argc, char **argv)
{
register int i = 1;

printf("%d\n", i);
i++;
printf("%d\n", i);

return 0;
}

في هذا الإسلوب يطلب البرنامج من المصرف أن يضع المتغير i قدر المستطاع في مسجل المعالج ,ربما لأنه يستخدم كثيراً, (المسجلات ذواكر صغيرة في قلب المعالج والوصول لها أسرع من الوصول للذاكرة).

غالباً ماتجدين register مستخدم في البرامج القديمة أو الأجزاء القديمة من أنظمة التشغيل عندما كانت المصرفات ضعيفة, لكن المصرفات الحديثة أصبحت أذكى بكثير مقارنة بالسابق وتستطيع تحسين البرنامج أفضل من المبرمج نفسه.

هناك تفاصيل أكثر وأشياء تحدث في الخلفية, إذا أردتي التعمق إبحثي عن stack frame, لكن المعلومات السابقة كافيه للدراسة.

تم تعديل بواسطه Mr.B
2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

الـ Storage Classes تعني طبقات التخزين الموجودة في لغة برمجة معينة, كل طبقة تتميز عن الأخرى حسب مدى الرؤية الذي تتميز به بالإضافة إلى كيفية التخزين في الذاكرة.

C++ تُوفر 4 طبقات (ورثتها عن أمها الحنون, السي) كالتالي :

  1. auto : من أجل المتغيرات المحلية (Local Variables).
  2. extern : من أجل الإعلان عن متغير دون تعريفه.
  3. register : تأمر البرنامج بتخزين المتغير (حسب الإمكان) داخل مسجل خاص بالمعالج.
  4. static : تُضيف صفة "الاستمرارية" إلى المتغير المعني.

الطبقتين static و extern هما الأكثر استخداماً و طبقة register متوسطة الاستخدام أما طبقة auto فقد عفا عليها الزمن.

نأتي الآن إلى الخوض في التفاضيل :

يتم الإعلان عن المتغيرات المحلية داخل دالة معينة, و لا يمكن استخدامها إلا داخل الدالة أو الإطار التي أُعلنت بداخله أما المتغيرات العامة فيتم الإعلان عنها خارج جميع الدوال, ويمكن لأي دالة في البرنامج استعمال هذا النوع المتغيرات.

تنتهي أعمار المتغيرات العامة عند انتهاء تنفيذ البرنامج بينما ينتهي عمر المتغيرات الخاصة عند الانتهاء من تنفيذ الدالة الموجودة بها.

بالنسبة للكلمة static فتُستخدم مع المتغيرات الساكنة, و عند إضافتها إلى أي متغير فهذا يعني أنك قد أضفت له صفتين رئيسيتين هما:

  • أصبح عمر المتغير مثل عمر المتغيرات العامة التي لا تُمسح من الذاكرة إلا إذا طلبت ذلك برمجيا, أو بانتهاء تنفيذ البرنامج .. لأن المتغيرات العامة تكون مُعرضة للقراءة في أي وقت ومن أي دالة.
  • لا ُيمكن رؤيتها إلا داخل الإطار التي أُعلنت بداخله.

المتغيرات الساكنة تأخذ مزايا النوعين السابقين .. فهي مثل المتغيرات الخاصة لأن هناك دالة وحيدة تستطيع رؤيتها وهي الدالة التي تم الإعلان عن المتغير بداخلها ,و من ناحية أُخرى فالمتغيرات الساكنة مثل المتغيرات العامة لأنها لا تنتهي أو تُمسح من الذاكرة عندما ينتهي تنفيذ الدالة التابعة لها .. بل تظل مخزنة في الذاكرة (جاهزة للاستدعاء) حتى ينتهي تنفيذ البرنامج.

مثال :

#include <iostream>
using namespace std;

void fct(void) {
static int i; //القيمة الابتدائيةالافتراضية للمتغيرات الساكنة هي الصفر
cout << "appel numéro : " << i++ << endl;
}

int main() {
for (int n = 1; n <= 5; n++)
fct();
return 0;
}

أيضا, إضافة الكلمة static إلى الدوال تعني أنه لا يُمكن رؤية تلك الدوال خارج الملف الذي أعلن عنهم فيه.

أما فيما يخص استخدام متغير عام مُعرف في ملف مصدري آخر (another source file) فتسمح الكلمة المُعرفة مُسبقا extern بالإعلان عن متغير عام سبق تعريفه في نفس الملف المصدري أو في ملف آخر. في المثال التالي, يتكون المشروع من ملفين هما globales.cpp و main.cpp, الملف الأول يحتوي على الإعلان عن متغيرين عامَّيْن و الملف الثاني يستخدم تلك المتغيرات :

globales.cpp :

int globale_1 = 1;
int globale_2 = 2;

main.cpp :

#include <iostream>
using namespace std;

extern int globale_1;
int get_globale_2(void);

int main(void) {
cout << "globale_1 = " << globale_1 << endl;
cout << "globale_2 = " << get_globale_2() << endl;
return 0;
}

int get_globale_2(void) {
extern int globale_2;
return globale_2;
}

بالتوفيق.

4

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .