| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > изменение класс-мембера во время проверки |
| Автор: CompWorm 4.12.2014, 03:09 | ||||||
| привет. всё же с трудом у меня после c++ перевариваются java поинтеры...
почему на выходе
? на всякий случай код стрингового иквела:
я думал, что перед входом в функцию (в данном случае, в equals() ) сперва разрешаются параметры, а потом выполняется код функции, а не "on-demand" (см строки 9 и 10 в equals) |
| Автор: LSD 4.12.2014, 12:02 | ||
Тут указатели вообще не причем, просто особенности байткода. Запускаем javap и смотрим что там компилятор сгенерировал:
0 - положили this на вершину стека (стек: this) 1 - получили у объекта с вершины стека поле aaa и положили его на вершину стека (стек: "world") 4 - положили this на вершину стека (стек: "world", this) 5 - вызвали у объекта с вершины стека getModd() (стек до: "world", this / после: "world", "hello") 7 - вызываем String.equals() у объекта с вершина стека - 1, с аргументом с вершины стека Т.е. компилятору было проще вытащить старое значение, положить его на стек и только потом уже вызывать getModd(). |
| Автор: CompWorm 5.12.2014, 00:32 |
| прикольно, а спека что-нибудь говорит про чудеса оптимизации? я так понимаю, что в Java оптимизацию незя отключить и результат будет разный на разных JVM, осях и процах? |
| Автор: AlexeyVorotnikov 5.12.2014, 10:53 |
| Компилятор скомпилировал метод compr строго в соответствии со спецификацией языка Java, и результат будет одинаковый на любой JVM, оси и проце. |
| Автор: CompWorm 5.12.2014, 21:22 | ||
пустая фраза. а с этим http://stackoverflow.com/questions/1514949/quick-java-optimization-question#1514982 LSD, спасибо! |