سؤال

أريد أن أعرف لماذا يتم تهيئة المتغيرات الثابتة بالضبط في C، C ++ و Java بواسطة الصفر افتراضيا؟ ولماذا هذا غير صحيح للمتغيرات المحلية؟

هل كانت مفيدة؟

المحلول

لماذا تتغير المتغيرات الثابتة تهيئة المتغيرات المحلية أو غيرها؟

معرفة كيف يتم تنفيذ المتغيرات الثابتة. يتم تخصيص الذاكرة بالنسبة لهم في الوقت الرابط، كما يتم توفير القيمة الأولية لهم أيضا في وقت الارتباط. لا يوجد وقت التشغيل النفقات العامة.

من ناحية أخرى، يتم تخصيص ذاكرة المتغيرات المحلية في وقت التشغيل. المكدس يجب أن تنمو. أنت لا تعرف ما كان هناك من قبل. إذا كنت تريد، يمكنك مسح هذه الذاكرة (صفر)، ولكن ذلك من شأنه أن يتحمل النفقات العامة وقت التشغيل. الفلسفة C ++ هي "أنت لا تدفع مقابل الأشياء التي لا تستخدمها"، لذلك لا صفر هذه الذاكرة افتراضيا.

حسنا، ولكن لماذا تتم تهيئة المتغيرات الثابتة إلى الصفر، وليس بعض القيمة الأخرى؟

حسنا، أنت تريد عموما أن تفعل شيئا مع هذا المتغير. ولكن بعد ذلك كيف تعرف ما إذا كان قد تمت تهيئته؟ يمكنك إنشاء متغير منطقية ثابت. ولكن بعد ذلك يجب تهيئة شيء بشكل موثوق لشيء (يفضل خطأ). ماذا عن مؤشر؟ كنت تفضل أن ترغب في تهيئة للاغة من بعض القمامة العشوائية. ماذا عن بنية / سجل؟ لديها بعض أعضاء البيانات الآخرين في الداخل. من المنطقي تهيئة جميعها لقيمها الافتراضية. ولكن بالنسبة للبساطة، إذا كنت تستخدم استراتيجية "تهيئة إلى 0"، فلن تضطر إلى تفتيش الأعضاء الفرديين وتحقق من أنواعهم. يمكنك فقط تهيئة منطقة الذاكرة بأكملها إلى 0.

هذا ليس متطلبات فنية حقا. لا يزال من الممكن اعتبار دلالات التهيئة عاقلا إذا كانت القيمة الافتراضية هي شيء آخر غير 0، ولكن لا يزال محتملا. ولكن بعد ذلك، ماذا يجب أن تكون هذه القيمة؟ يمكنك بسهولة شرح سبب استخدام 0 (على الرغم من أنه يبدو بالفعل تعسفا قليلا)، ولكن يبدو أن شرح -1 أو 1024 أصعبا (خاصة أن المتغير قد لا يكون كبيرا بما يكفي لعقد هذه القيمة، إلخ).

ويمكنك دائما تهيئة المتغير صراحة.

ولديك دائما الفقرة 8.5.6 من معيار C ++ والتي تقول "يجب أن تكون كل كائن من مدة التخزين الثابتة من الصفر عند بدء تشغيل البرنامج".

لمزيد من المعلومات، يرجى الرجوع إلى هذه الأسئلة الأخرى:

نصائح أخرى

الفقرة 8.5.6 من الدول القياسية C ++ التي:

"يجب أن تكون كل كائن من مدة التخزين الثابتة في بدء تشغيل البرنامج"

(تقول المعيار أيضا أن تهيئة المتغيرات المحلية غير محددة)

أما لماذا، فإن المعيار لا يقول؛) تخمين واحد هو أنه من السهل التنفيذ بشكل معقول دون أي سلبيات إضافية.

التحدث عن جافا:

يجب تهيئة المتغيرات المحلية قبل أن تتمكن من الوصول إليها، لأنها مكسب أمان. يتحقق برنامج التحويل البرمجي لك، إذا تم تعيين المتغير بالتأكيد.

يتم تهيئة المتغيرات الثابتة أو الفئة (مع نوع كائن) مع null, ، نظرا لأن المحول البرمجي لا يستطيع التحقق مما إذا كانت تتم تهيئتها في وقت الترجمة. بدلا من التخلي عن البرنامج يفشل إذا كان يصل إلى متغير غير تهيئة، فسيتم تهيئة ذلك ضمنيا null.

المتغيرات مع نوع الأصلي لا يمكن الحصول على null القيمة، لذلك يتم تهيئة المتغيرات غير المحلية مع 0 أو false, ، كعطاسية. إنه ليس أفضل حل، بالتأكيد، لكنني لا أعرف أفضل واحد. ؛-)

إلى حد ما، هذه مجرد قرارات تصميم من جانب مصممي اللغة. لكن الأسباب المحتملة لهذه القرارات في جاوة هي:

  • بالنسبة للمتغيرات الثابتة / الأعضاء، إذا كنت ستربطها إلى شيء ما، فإن الصفر هي قيمة مريحة لأن (أ) إنها قيمة مناسبة عموما تعني "غير مضبوط على أي شيء آخر خاص"، وهي القيمة التي لديك اختار على أي حال في بعض الحالات مثل العدادات؛ و (ب) داخليا، من المحتمل أن يتم استخدام الصفر للقيم "الخاصة"، لا سيما لتمثيل null في حالة مرجع كائن.
  • بالنسبة للمتغيرات المحلية، فإن منحهم لا يسمح الافتراضي بالقاعدة التي تفرض المبرمج لتعيين بعض القيمة قبل قراءة المتغير، والتي يمكن أن تكون مفيدة في الواقع في السماح للمترجم بإحراز الأخطاء في بعض الأخطاء.

في حالة المتغيرات المحلية، لا يمكن تصوره أيضا أن يتم الإعلان عن المتغير المحلي (الذي يعني في مستوى رمز الجهاز / الجهاز بشكل أساسي تخصيص مساحة المكدس / تحريك مؤشر المكدس) ولكن بعد ذلك أبدا مكتوبة / قراءة في مسار رمز معين. لذلك فإن عدم وجود افتراضي يتجنب القيام بعمل غير ضروري لإعداد الافتراضي في تلك الحالات.

أكرر، على الرغم من أن هذه قرارات تصميم إلى حد ما. إنها أساسا مفاضلة بين ما هو من المرجح أن تكون مريحة لتطبيقات JVM ومريحة للمبرمجين.

NB في C / C ++، المتغيرات "الثابتة" تعني شيئا مختلفا للمتغيرات الثابتة في Java!

ليس لدي أي فكرة عن جافا وأشك في أنها مختلفة عن الإحصاء / السكان المحليين في جافا.

أما بالنسبة ل C و C ++، فهذا يتعلق برامج المبرمجين تأثير كودهم وحب كونهم في السيطرة. إن تهيئة المتغيرات المحلية تعني تنفيذ التعليمات البرمجية الإضافية في كل مرة يدخل فيها البرنامج النطاق. في كثير من الأحيان دعا الوظائف التي قد تكون كارثة.

هذا له علاقة بمفهوم "الدفع فقط مقابل ما تستخدمه" في C / C ++.

بالنسبة للمتغيرات الثابتة، يمكن إجراء التهيئة دون إنشاء رمز. يحتوي ملف الكائن على القيم الأولية للمتغيرات في مقطع البيانات وعندما يقوم نظام التشغيل بتحميل تطبيقه القابل للتنفيذ ويقدم هذا الجزء البيانات قبل بدء تشغيل البرنامج.

بالنسبة للمتغيرات المحلية، لا توجد طريقة لتهيئةها دون رمز لأنها لم تتم تهيئتها مرة واحدة، ويجب تهيئةها في كل مرة تدخل فيها نطاقها؛ كما يتم تخصيصها في المكدس، وعندما يحدث التخصيص القيمة الأولية في المكدس في الحالة العامة هي ببساطة ما كان هناك من قبل (باستثناء تلك اللحظات النادرة التي تنمو كومة أكثر مما نمت من قبل).

حتى تهيئة متغير محلي ضمنيا، سيحتاج المحول البرمجي إلى إنشاء رمز بدون مبرمج يقوده صراحة للقيام بذلك، وهو ما يعارضه "الفلسفة" تماما.

حول جافا، بقدر ما أعرف، يتم تهيئة المتغيرات دائما عندما يدخل البرنامج نطاقها، بغض النظر عما إذا كانت ثابتة أم لا. الفرق الهام الوحيد بينهما هو أن نطاق المتغيرات الثابتة هو البرنامج بأكمله. بالنظر إلى أنه، فإن السلوك يتفق بين كل منهم.

هذا مجرد تخمين، لكن قد يكون الأمر كما هو الحال بالنسبة للإحصاء لأنه سهل التنفيذ، ومفيد.

يمكن للمترجم التعاوني على تخصيص جميع المتغيرات في منطقة ذاكرة واحدة تلغى، ثم إما ينبعث من التعليمات البرمجية (واحدة memset() دعوة) لمسحها من قبل main() يسمى. في كثير من الحالات، يمكن أن يعتمد أيضا على ميزات تنسيق الملف القابل للتنفيذ لنظام التشغيل، إذا كان هذا التنسيق يدعم "مقاطعات BSS ", ، والتي يتم مسحها بواسطة Loader بدلا من ذلك. هذا يحفظ المساحة في الملف القابل للتنفيذ، يمكن أن يكون لديك

static unsigned char megabyte[1 << 20];

والتنفيذ لن ينمو بواسطة ميغابايت.

للمتغيرات المحلية، لا يتم تطبيق أي من هذه؛ يتم تخصيصها "على الطاير" (عادة على كومة)، وسوف تكون مضيعة للموارد لمسحها، لأنها ستتم تعيينها عادة قريبا على أي حال.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top