سؤال

تم تحرير هذا السؤال بسبب أمثلة سيئة .. هنا سؤالي المحدث:

هل سيكون ما يلي متساويًا في السرعة وتخصيص الذاكرة:

int b;
for (int i = 0; i < 1000; i++)
    b = i;

و

for (int i = 0; i < 1000; i++)
    int b = i;
هل كانت مفيدة؟

المحلول

لا ، لن.

في الحالة الأولى ، حصلت على متغير واحد يتم تعيينه 1000 قيم مختلفة - وينتهي بك الأمر إلى الحصول على القيمة الأخيرة (999) بعد اكتمال المنشئ.

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

لاحظ أن هذا لا يقتصر على البدائل - أي نوع آخر سيتصرف بنفس الطريقة أيضًا.

نصائح أخرى

  • نعم. كلاهما عديمة الفائدة تماما.
  • لا. حجم مثيل Class1 أكبر من حجم مثال Class2 ، بسبب متغير العضو.

الجواب يعتمد على ما تعنيه بقول "متساوٍ" =)

لا.

  • في Class1 المتغير a هو حقل يمكن الوصول إليه بجميع الطرق في الفصل.
  • في Class2 ليست هذه هي القضية: a هو متغير محلي داخل الطريقة assign. بعد assign ينتهي ، قيمة a يتم تجاهله.

لا ، واحد لديه متغير مثيل a (class1) ، والآخر لم.

في المقام الأول ، لقد أعلنت بالفعل B باعتبارها int ويتم تحديث قيمتها في كل مرة تنفذ فيها الحلقة. في الثانية ، يتم الإعلان عن B وتهيئته إلى قيمة I في كل مرة تنفذ فيها الحلقة. لست متأكدًا بنسبة 100 ٪ ولكني أعتقد أن الحالة الثانية هي أكثر كثافة في الذاكرة ، لكنني لا أعتقد أن فرق السرعة سيكون ملحوظًا.

تجدر الإشارة إلى أن أي مترجم يستحق ملحه ، وأعتقد اعتقادا راسخا أن JIT يستحق الكثير من الملح ، سيضع جانبا مساحة "ب" مرة واحدة في الحالة الثانية ، أي أن مرحلة "الإعلان" ستكون بلا معنى.

هل جربت هذا؟ حتى أنه لا يجمع!

for (int i = 0; i < 1000; i++)
    int b = i;

رسائل الخطأ من المترجم:

Example.java:4: '.class' expected
                    int b = i;
                        ^
Example.java:4: not a statement
                    int b = i;
                    ^
Example.java:4: illegal start of expression
                    int b = i;
                          ^

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

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