if (isSet($_SESSION['started'])){
if((mktime() - $_SESSION['started'] - 60*30) > 0){
//Logout, destroy session, etc.
}
}
else {
$_SESSION['started'] = mktime();
}
Он генерирует эквивалент:
String s = new StringBuilder("abc")
.append(methodReturningAString())
.append("ghi")
.append(anotherMethodReturningAString())
.append("omn")
.append("blablabla")
.toString();
Достаточно умен для предварительного объединения статических строк (то есть . Вы можете назвать использование «omn» + «blablabla»
) StringBuilder
«уловкой производительности», если хотите. Это определенно лучше для производительности, чем выполнение пяти конкатенаций, приводящих к появлению четырех ненужных временных строк. Кроме того, использование StringBuilder улучшило производительность (я думаю) Java 5; до этого использовался StringBuffer.
Edit : как указано в комментариях, статические строки предварительно объединяются, только если они находятся в начале объединения. Иначе нарушится порядок операций (хотя в данном случае я думаю, что Sun могла бы это оправдать). Итак, учитывая это:
String s = "abc" + "def" + foo() + "uvw" + "xyz";
он будет скомпилирован следующим образом:
mov ebx, [boo]
означает «получить четыре байта со смещением, указанным boo
внутри ebx
».
Аналогичным образом, mov [goo], ebx
переместит содержимое ebx на смещение, указанное goo
.
Однако код часто доступен только для чтения, поэтому он не будет будет удивительно видеть, что код просто падает.
Вот как кодируются инструкции в boo
:
boo:
b8 03 00 00 00 mov eax,0x3
c3 ret
Итак, то, что вы получаете в ebx
, на самом деле составляет 4/5 от инструкция mov eax, 3
.
Первый mov копирует из смещения goo относительно сегментного регистра [e] DS. Второй mov записывает со смещением foo в расположение данных относительно регистра DS. Если CS и DS совпадают, то это можно игнорировать. Если предположить, что CS и DS совпадают, то в следующий раз вы, вероятно, столкнетесь с различными механизмами защиты, которые делают разделы кода доступными только для чтения.
Продолжение RE:
mov eax, 2
(который, Здесь нет никаких закрытий или чего-то глубокого такого рода. (Это немного упрощает - код можно перемещать, и во многих случаях исправления применяются к использованию смещений комбинацией компоновщика и загрузчика) Дополнительные ответы:
Это дает вам машинный код, начинающийся с адреса. Насколько это зависит от длины вашей загрузки, в данном случае это 4 байта.
Это может быть несколько команд или только фрагмент команды. На этой архитектуре (Intel x86) команды машинного кода имеют размер от 8 до 120 бит.
3.