Как я должен способствовать предупреждениям Perl фатальным ошибкам во время разработки?

Наиболее важный момент - то, что "куча" и стек являются общими обозначениями для путей, которыми может быть выделена память. Они могут быть реализованы по-разному, и условия относятся к фундаментальным понятиям.

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

    Stack like a stack of papers

    простота стека - то, что Вы не должны поддерживать таблицу, содержащую запись каждого раздела выделенной памяти; единственной информацией состояния, в которой Вы нуждаетесь, является единственный указатель до конца стека. Чтобы выделить и освободить, Вы просто увеличиваете и постепенно уменьшаете тот единственный указатель.Примечание: стек может иногда реализовываться, чтобы запуститься наверху раздела памяти и расшириться вниз вместо того, чтобы расти вверх.

  • В "куче", нет никакого особого порядка к способу, которым помещаются объекты. Можно достигнуть в и удалить объекты в любом порядке, потому что нет никакого ясного 'главного' объекта.

    Heap like a heap of licorice allsorts

    выделение "кучи" требует поддержания полного отчета того, какая память выделяется и что не, а также некоторое служебное обслуживание, чтобы уменьшить фрагментацию, найти непрерывные сегменты памяти достаточно большими для установки требуемому размеру, и так далее. Память может быть освобождена в любое время, оставив свободное пространство. Иногда средство выделения памяти будет выполнять задачи обслуживания, такие как дефрагментирующаяся память путем перемещения выделенной памяти или сборки "мусора" - определяющий во времени выполнения, когда память больше не будет в объеме и освобождении его.

Эти изображения должны сделать довольно хорошее задание описания двух способов выделить и освободить память в стеке и "куче". Конфетка!

  • , До какой степени ими управляют время выполнения языка или ОС?

    , Как упомянуто, "куча" и стек являются общими терминами и могут быть реализованы во многих отношениях. Компьютерные программы обычно имеют стек, названный стек вызовов , который хранит информацию, относящуюся к текущей функции, такой как указатель на то, какой бы ни функционируют, от этого назвали, и любые локальные переменные. Поскольку функции вызывают другие функции и затем возвращаются, стек растет и уменьшается для содержания информации от функций далее вниз стек вызовов. Программа действительно не имеет контроля во время выполнения над ним; это определяется языком программирования, ОС и даже архитектурой системы.

    "куча" А является общим термином, использованным для любой памяти, которая выделяется динамично и случайным образом; т.е. не в порядке. Память обычно выделяется ОС с приложением, называя API-функции, чтобы сделать это выделение. Существует немного издержек, требуемых в управлении динамично выделенной памятью, которая обычно обрабатывается ОС.

  • , Каков их объем?

    стек вызовов является таким низкоуровневым понятием, которое он не связывает с 'объемом' в смысле программирования. При разборке некоторого кода, Вы будете видеть относительные ссылки стиля указателя на части стека, но насколько высокоуровневый язык затронут, язык навязывает свои собственные правления объема. Один важный аспект стека, однако, то, что, как только функция возвращается, что-либо локальное для той функции сразу освобождено от стека. Это прокладывает себе путь, Вы ожидали бы, что это будет работать данное, как работают Ваши языки программирования. В "куче" также трудно определить. Объем - то, что представлено ОС, но Ваш язык программирования, вероятно, добавляет свои правила о том, что "объем" находится в Вашем приложении. Архитектура процессора и ОС используют виртуальное обращение, которое процессор переводит в физические адреса и и т.д. существуют отсутствия страницы. Они отслеживают то, какие страницы принадлежат который приложения. Никогда действительно необходимо волноваться об этом, тем не менее, потому что Вы просто используете любой метод Ваше использование языка программирования, чтобы выделить и свободная память и проверить ошибки (если выделение/освобождение перестало работать по какой-либо причине).

  • , Что определяет размер каждого из них?

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

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

  • , Что делает один быстрее?

    стек быстрее, потому что вся свободная память всегда непрерывна. Никакой список не должен вестись всех сегментов свободной памяти, просто единственный указатель на текущую вершину стека. Компиляторы обычно хранят этот указатель в специальном предложении, быстром регистр с этой целью. Кроме того, последующие операции на стеке обычно концентрируются в очень соседних областях памяти, которая на очень низком уровне хороша для оптимизации процессором на - умирают кэши.

13
задан Hissohathair 30 August 2009 в 05:54
поделиться

2 ответа

Думаю, вы ищете Test :: NoWarnings .

21
ответ дан 1 December 2019 в 19:08
поделиться

Причина использования предупреждений FATAL => qw (all); не работает для вас, потому что использование предупреждений имеет лексическую область видимости. Поэтому любые предупреждения, созданные внутри TestHelper.pm, будут фатальными, но предупреждения, созданные в другом месте, будут работать как обычно.

Если вы хотите включить фатальные предупреждения глобально, я думаю, что обработчик $ SIG {__ WARN __} , вероятно, единственный способ сделать это. Если вы не хотите, чтобы он взорвался при первом предупреждении, вы можете позволить своему обработчику сохранить их в массиве, а затем проверить его в блоке END .

my @WARNINGS;
$SIG{__WARN__} = sub { push @WARNINGS, shift };

END { 
    if ( @WARNINGS )  {       
        print STDERR "There were warnings!\n";
        print "$_\n" for @WARNINGS;
        exit 1;
    }
}
17
ответ дан 1 December 2019 в 19:08
поделиться
Другие вопросы по тегам:

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