F>Есть ли разница между этими двумя блоками? Или всё сведётся к одному и тому же байт-коду?
Во втором случае obj доступен за пределами цикла. Теоретически, если ты к нему не обращаешься за пределами цикла, компилятор мог бы провести оптимизацию и поместить объявление переменной в тело цикла, но не думаю, что он так делает Так что да, разница есть. Еще момент — обьект, созданный при последнем проходе, не будет доступным для сборщика мусора, пока obj не выйдет из области видимости.
Здравствуйте, Foror, Вы писали:
F>цикл { F> Object obj = new Object(); F>}
F>или
F>Object obj = null;
F>цикл { F> obj = new Object(); F>}
F>Есть ли разница между этими двумя блоками? Или всё сведётся к одному и тому же байт-коду?
В первом случае не будет операции присвоения null. В остальном разницы быть не должно. Хотя не знаю как на счет случая если obj ещё используется поле цикла. Но мы ведь его не рассматриваем?
Здравствуйте, Gajdalager, Вы писали:
G>Во втором случае obj доступен за пределами цикла. Теоретически, если ты к нему не обращаешься за пределами цикла, компилятор мог быпровести оптимизацию и поместить объявление переменной в тело цикла, но не думаю, что он так делает ...
А в чем здесь оптимизация? Вот когда компилятор из цикла выносит объявление переменной, это да, на этом оптимизируется выделение байт (4?), нужных для хранения адреса объекта.
Здравствуйте, Foror, Вы писали:
F>Есть ли разница между этими двумя блоками?
надо стремиться к сокращению области видимости объекта. т.е. если объект за пределами цикла не нужен, то объявлять его надо внутри. это, как минимум, хороший стиль.
Здравствуйте, Foror, Вы писали:
F>цикл { F> Object obj = new Object(); F>}
F>или
F>Object obj = null;
F>цикл { F> obj = new Object(); F>}
F>Есть ли разница между этими двумя блоками? Или всё сведётся к одному и тому же байт-коду?
если снаружи переменная не используется, на кой черт она там обьвляется? Чтобы разобраться впоследствие в этом коде было сложнее?
Здравствуйте, Foror, Вы писали:
F>цикл { F> Object obj = new Object(); F>}
F>или
F>Object obj = null;
F>цикл { F> obj = new Object(); F>}
F>Есть ли разница между этими двумя блоками? Или всё сведётся к одному и тому же байт-коду?
Все просто. Есть такая прога — jad; надо скомпилировать два упомянутых примера, раз-jad'ить class'ы и посмотреть. Разницы нет.
Можно еще проще — сравнить размеры class'ов.
Здравствуйте, JSerge, Вы писали:
JS>Все просто. Есть такая прога — jad; надо скомпилировать два упомянутых примера, раз-jad'ить class'ы и посмотреть. Разницы нет. JS>Можно еще проще — сравнить размеры class'ов.
В результате предложенных действий можно узнать, как компилятор определенной версии определенного производителя строит этот фрагмент кода. Автор же, насколько я понял, имел ввиду нечто более общее, что-то вида 'позволено ли компилятору заоптимизировать предложенный кусок таким образом, чтобы объявление локальной переменной цикла было расположено вне цикла'.
Ответ имхо да (с точки зрения логики), но для стопроцентной уверенности все равно надо смотреть спеку.
JS>Все просто. Есть такая прога — jad; надо скомпилировать два упомянутых примера, раз-jad'ить class'ы и посмотреть. Разницы нет. JS>Можно еще проще — сравнить размеры class'ов.
Есть такая прога javap. Можно запустить с опцией -с и посмотреть какая разница в байткоде.
Здравствуйте, dotidot, Вы писали:
D>... D>Вывод: тема не стоит потраченного на неё времени
На самом деле, приведенный тест вообще ничего не показывает, потому что он не делает того, что задумывалось.
JIT-компилятор либо вместо цикла сделает прямой инкремент переменной на нужное число, либо, что более вероятно, вообще выкинет вызов метода. Подробнее об искусстве не наступания на грабли во время построения микротеста можно почитать здесь