Странное поведение стека в C

Используйте это:

{=SMALL(IF(ISNUMBER($A$2:$A$7)*ROW($A$2:$A$7)=0,"",ROW($A$2:$A$7)),2)-1}

2 близко к концу определит, если вы заинтересованы в наименьшем числовом значении nth. В этом случае 2nd.

Обратите внимание, что это формула массива, введенная с помощью Ctrl Shift Enter

10
задан Uri 22 March 2009 в 00:03
поделиться

6 ответов

Компилятор полностью в его правах не оптимизировать temp1 и temp2 в то же местоположение. Это были много лет, с тех пор как компиляторы сгенерировали код для одной операции стека за один раз; в эти дни целый стековый фрейм размечается в, каждый идет. (Несколько лет поддерживают коллегу, и я выяснил особенно умный способ сделать это.) Расположение стека Naive, вероятно, помещает каждую переменную в свой собственный слот, даже когда, как в Вашем примере, их время жизни не накладывается.

Если Вам любопытно, Вы могли бы получить различные результаты с gcc -O1 или gcc -O2.

19
ответ дан 3 December 2019 в 15:06
поделиться

Нет никакой гарантии, что объекты стопки адреса получат независимо от порядка, которым они объявляются.

Компилятор может счастливо переупорядочить создание и продолжительность переменных стека, если это не влияет на результаты функции.

4
ответ дан 3 December 2019 в 15:06
поделиться

Я полагаю, что стандарт C просто говорит об объеме и время жизни переменных, определенных в блоке. Это не делает обещаний о том, как переменные взаимодействуют со стеком или если стек даже существует.

4
ответ дан 3 December 2019 в 15:06
поделиться

Я не забываю читать что-то об этом. Все, что я имею теперь, является этой неясной ссылкой.

Только для уведомления всех (и ради архивов) это, кажется, наше расширение ядра, сталкивается с известным ограничением GCC. Только для резюме у нас есть функция в очень портативной, очень легкой библиотеке, которая по некоторым причинам становится скомпилированной с 1600 + стопка байта при компиляции на/для Darwin. Какие параметры компилятора я попробовал, и какие уровни оптимизации я использовал, стек был не меньшим, чем паника "машинного контроля" 1400 года в довольно восстанавливаемом (но не частый) ситуации.

После большого поиска в сети, изучения некоторого i386 блока и говорящий с некоторыми людьми, которые намного лучше в блоке, я узнал, что GCC несколько известен за то, что имел неприятное выделение стека. [...]

По-видимому, это - грязный небольшой секрет gcc, кроме он не большая часть секрета некоторым - Linus Torvalds несколько раз жаловался в различных списках о выделении стопки gcc (ищите lkml.org "gcc использование стека"). После того как я знал, что искать, было много хватания о выделении gcc ниже среднего переменных стека, и, в частности, это - неспособность снова использовать стековое пространство для переменных в различных объемах.

После этих слов моя версия Linux gcc правильно стековое пространство повторных использований, я получаю тот же адрес для обеих переменных. Не уверенный, что стандарт C говорит об этом, но строгое осуществление объема только важно для правильности кода в C++ (из-за разрушения в конце объема), но не в C.

2
ответ дан 3 December 2019 в 15:06
поделиться

Нет никакого стандарта, который устанавливает, как переменные помещаются в стек. То, что происходит в компиляторе, намного более сложно. В Вашем коде компилятор может даже принять решение полностью проигнорировать и подавить переменные a и b.

Во время многих этапов компилятора код может быть преобразован в, он - форма SSA, и все переменные стека теряют свои адреса и значения в этой форме (он может даже мешать отладчику).

Стековое пространство является очень дешевым, в том смысле, что время для выделения или 2 или 20 переменных является постоянным. Кроме того, стековое пространство является очень динамичным для большинства вызовов функции, с тех пор за исключением нескольких функций (они ближе main() и функции записи потока, с долговечными циклами событий или так), они имеют тенденцию завершаться быстро. Так, Вы просто не беспокоитесь ими.

1
ответ дан 3 December 2019 в 15:06
поделиться

Это абсолютно зависит от компилятора и как он настроен.

0
ответ дан 3 December 2019 в 15:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: