Используйте это:
{=SMALL(IF(ISNUMBER($A$2:$A$7)*ROW($A$2:$A$7)=0,"",ROW($A$2:$A$7)),2)-1}
2 близко к концу определит, если вы заинтересованы в наименьшем числовом значении nth
. В этом случае 2nd
.
Обратите внимание, что это формула массива, введенная с помощью Ctrl kbd> Shift kbd> Enter kbd>
Компилятор полностью в его правах не оптимизировать temp1
и temp2
в то же местоположение. Это были много лет, с тех пор как компиляторы сгенерировали код для одной операции стека за один раз; в эти дни целый стековый фрейм размечается в, каждый идет. (Несколько лет поддерживают коллегу, и я выяснил особенно умный способ сделать это.) Расположение стека Naive, вероятно, помещает каждую переменную в свой собственный слот, даже когда, как в Вашем примере, их время жизни не накладывается.
Если Вам любопытно, Вы могли бы получить различные результаты с gcc -O1
или gcc -O2
.
Нет никакой гарантии, что объекты стопки адреса получат независимо от порядка, которым они объявляются.
Компилятор может счастливо переупорядочить создание и продолжительность переменных стека, если это не влияет на результаты функции.
Я полагаю, что стандарт C просто говорит об объеме и время жизни переменных, определенных в блоке. Это не делает обещаний о том, как переменные взаимодействуют со стеком или если стек даже существует.
Я не забываю читать что-то об этом. Все, что я имею теперь, является этой неясной ссылкой.
Только для уведомления всех (и ради архивов) это, кажется, наше расширение ядра, сталкивается с известным ограничением GCC. Только для резюме у нас есть функция в очень портативной, очень легкой библиотеке, которая по некоторым причинам становится скомпилированной с 1600 + стопка байта при компиляции на/для Darwin. Какие параметры компилятора я попробовал, и какие уровни оптимизации я использовал, стек был не меньшим, чем паника "машинного контроля" 1400 года в довольно восстанавливаемом (но не частый) ситуации.
После большого поиска в сети, изучения некоторого i386 блока и говорящий с некоторыми людьми, которые намного лучше в блоке, я узнал, что GCC несколько известен за то, что имел неприятное выделение стека. [...]
По-видимому, это - грязный небольшой секрет gcc, кроме он не большая часть секрета некоторым - Linus Torvalds несколько раз жаловался в различных списках о выделении стопки gcc (ищите lkml.org "gcc использование стека"). После того как я знал, что искать, было много хватания о выделении gcc ниже среднего переменных стека, и, в частности, это - неспособность снова использовать стековое пространство для переменных в различных объемах.
После этих слов моя версия Linux gcc
правильно стековое пространство повторных использований, я получаю тот же адрес для обеих переменных. Не уверенный, что стандарт C говорит об этом, но строгое осуществление объема только важно для правильности кода в C++ (из-за разрушения в конце объема), но не в C.
Нет никакого стандарта, который устанавливает, как переменные помещаются в стек. То, что происходит в компиляторе, намного более сложно. В Вашем коде компилятор может даже принять решение полностью проигнорировать и подавить переменные a
и b
.
Во время многих этапов компилятора код может быть преобразован в, он - форма SSA, и все переменные стека теряют свои адреса и значения в этой форме (он может даже мешать отладчику).
Стековое пространство является очень дешевым, в том смысле, что время для выделения или 2 или 20 переменных является постоянным. Кроме того, стековое пространство является очень динамичным для большинства вызовов функции, с тех пор за исключением нескольких функций (они ближе main()
и функции записи потока, с долговечными циклами событий или так), они имеют тенденцию завершаться быстро. Так, Вы просто не беспокоитесь ими.
Это абсолютно зависит от компилятора и как он настроен.