سؤال
تم تحرير هذا السؤال بسبب أمثلة سيئة .. هنا سؤالي المحدث:
هل سيكون ما يلي متساويًا في السرعة وتخصيص الذاكرة:
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;
^
يجب أن يحتوي جسم الحلقة على بيان واحد على الأقل. الإعلان المتغير ليس عبارة ، لذا فإن حلقة مع إعلان متغير فقط غير صالح.