Наследование модели Джанго странное или ожидаемое поведение?

Много интересных ответов на этот «старый» вопрос, даже некоторые относительно новые ответы, но я не нашел никаких упоминаний об этом ....

При правильном использовании и с осторожностью , последовательное использование alloca() (возможно, всего прикладного) для обработки небольших распределений переменной длины (или VLAs C99, если доступно) может привести к снижению общего роста стека, чем эквивалентная реализация в противном случае, используя большие локальные массивы фиксированной длины. Поэтому alloca() может быть полезен для вашего стека , если вы его тщательно используете.

Я нашел эту цитату .... Хорошо, я сделал эту цитату , Но на самом деле, подумайте об этом ....

@j_random_hacker очень прав в своих комментариях по другим ответам: Избегание использования alloca() в пользу больших локальных массивов не делает вашу программу более безопасной из стека переполнения (если ваш компилятор не является достаточно старым, чтобы разрешить встраивание функций, которые используют alloca(), в этом случае вы должны обновить или если вы не используете alloca() внутренние циклы, в этом случае вам не нужно использовать alloca() внутри циклов ).

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

alloca() (или VLAs) может быть правильным инструментом для задания.

Я видел время & amp; время, когда программист создает буфер, распределенный по стекам, «достаточно большой для обработки любого возможного случая». В глубоко вложенном дереве вызовов повторное использование этого шаблона (anti-?) Приводит к преувеличенному использованию стека. (Представьте, что дерево вызовов 20 уровней глубоко, где на каждом уровне по разным причинам функция слепо перераспределяет буфер размером 1024 байта «только для того, чтобы быть в безопасности», когда обычно он будет использовать только 16 или меньше из них, и только в очень редкие случаи могут использовать больше.) Альтернативой является использование alloca() или VLA и выделение только столько места стека, сколько требуется вашей функции, чтобы избежать излишнего обременения стека. Надеемся, что когда одна функция в дереве вызовов нуждается в распределении большего, чем обычно, другие в дереве вызовов все еще используют свои обычные небольшие распределения, а общее использование стека приложений значительно меньше, чем если бы каждая функция вслепую чрезмерно распределяла локальный буфер .

Но если вы решите использовать alloca() ...

Основываясь на других ответах на этой странице, кажется, что VLA должны быть безопасными (они не объединяют распределения стека если вы вызываете из цикла), но если вы используете alloca(), будьте осторожны, чтобы не использовать его внутри цикла, и make sure ваша функция не может быть встроена, если есть вероятность, что она может быть вызвана в цикле другой функции.

1
задан piedra 16 January 2019 в 01:57
поделиться

1 ответ

self.modified_at = timezone.now

Это ваша проблема. Вы хотели сделать timezone.now(). Это сбой при разборе даты из ссылки на функцию вместо строки или объекта datetime. Вы не активируете поведение, если пропустите метод save из класса BaseModel.

0
ответ дан Anonymous 16 January 2019 в 01:57
поделиться
Другие вопросы по тегам:

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