C #: Есть ли преимущество в размещении ресурсов в обратном порядке их распределения?

Много лет назад я был предупрежден, когда это возможно, высвобождать ресурсы в порядке, обратном тому, как они были распределены. То есть:

block1 = malloc( ... );
block2 = malloc( ... );

... do stuff ...

free( block2 );
free( block1 );

Я предполагаю, что на машине MS-DOS 640K это может минимизировать фрагментацию кучи. Есть ли практическое преимущество для этого в приложении на C # / .NET, или это привычка, которая изжила себя?

Ответы на вопрос(5)

 показывает вамизжил» на самом деле не включен, и редко бывает (не говорить и не говорить никогда после 40 лет доказательств) .. И это включает в себя стековую виртуальную машину, которая работает, скажем, на CMOS.

[Несмотря на некоторые попытки MSDN.com и Duffius заставить его исчезнуть, вы знаете, как управлять всем этим для вас, разница между кучей и стеком. Что за умная идея .. в космосе]

Решение Вопроса

это не должноне имеет значения (много).

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

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

Вот'Вот пример: посмотрите на операцию базы данных. Ты неЯ не хочу закрывать / утилизировать ваше соединение, прежде чем закрывать / утилизировать вашу команду (которая использует соединение).

 rama-jka toti09 нояб. 2009 г., 21:14
Таким образом, WC в RIIWC оксюморон заменяется на Aquisition, что подразумевает выпуск между прочим. А так как память и большое количество ресурсов в основном абстрагированы, опс, идёт идея ... и хаки всех видов. Короче говоря, этоЭто просто природа проблемы, и она очень важна.
 rama-jka toti09 нояб. 2009 г., 21:13
Создано хорошо не хорошо. Он должен быть зависимым от заказа, зависимым от выпуска и известным во многих обстоятельствах. Это не моглоБольше не имеет значения во всех реализациях баз данных, транзакций и всего, что работает в стеке (большинство программ там). Замки являются еще одним примером и естьs стеки не внешних и небедных библиотек, использующих его. Файловые операции и их блокировки - другое. Событие утечки другое. Любой неуправляемый ресурс в зависимости от еще одного. Создание и разрушение идут рука об руку, и идиома не может быть взломана как Resource-Initialization-Is- "хорошо Creation «.
 rama-jka toti09 нояб. 2009 г., 21:25
И пока яЯ не защищаю здесь зависимость от порядка, правильное наблюдение состоит в том, что это чрезвычайно важно, но редко желательно. Но это что-то даже ВМОфициальные спецификации крайне ограничены. Java подразумевает, в частности, и CLR в меньшей, но все же значительной степени. Это хак, чтобы не нарушать большие объемы рабочего кода и сделанные предположения, - смелое решение разработчиков компиляторов и jit backend. Код, способный к обработке, не зависящей от порядка, предоставляет огромный набор возможностей, но может оказаться невозможным для множества сценариев.

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

Если вы имеете в виду вызов IDisposable.Dispose (), то это зависит от поведения объектов, реализующих интерфейс IDisposable.

В общем, порядок неЭто имеет значение для большинства объектов Framework, за исключением тех случаев, когда это имеет значение для вызывающего кода. Но если объект A поддерживает зависимость от объекта B, а объект B удаляется, то вполне может быть важно не делать определенные вещи с объектом A.

В большинстве случаев Dispose () не вызывается напрямую, а вызывается неявно как часть оператора using или foreach, и в этом случае шаблон обратного порядка естественным образом возникает в соответствии с вложением оператора.

using(Foo foo = new Foo())
using(FooDoodler fooDoodler = new FooDoodler(foo))
{
  // do stuff
  // ...
  // fooDoodler automatically gets disposed before foo at the end of the using statement.
}

а методов Finalize. Например, пустьскажем, есть объект, который содержит указатель на внутренний объект. Сборщик мусора обнаружил, что оба объекта являются мусором. Кроме того, скажем, что внутренний объектМетод Finalize вызывается первым. Теперь внешний объект• Методу Finalize разрешен доступ к внутреннему объекту и вызов методов на нем, но внутренний объект был завершен, и результаты могут быть непредсказуемыми. По этой причине настоятельно рекомендуется, чтобы методы Finalize не обращались ни к каким внутренним объектам-членам ».

http://msdn.microsoft.com/en-us/magazine/bb985010.aspx

Таким образом, вы можете беспокоиться о семантике утилизации LIFO сколько угодно, но если вы ее утечете, Dispose () 'Они будут вызываться в любом порядке, который предпочитает CLR.

(Это более или менее то, что сказал Уилл, выше)

ровать и перемещать объекты в куче, так чтоне сказать, в каком порядке.

Кроме того, если выпереустанавливать A и B и A ссылки B это не должноНе имеет значения, удаляет ли A B при удалении A, поскольку метод Dispose должен вызываться более одного раза без исключения.

 Reed Copsey09 нояб. 2009 г., 20:40
Правда, если вы нене использовать "расположенный» ссылка случайно (через другой объект, созданный из него), так как вы располагаете в произвольном порядке.

Ваш ответ на вопрос