Сборка "мусора" может сосуществовать с явным управлением памятью?

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

window.onload = resizeHeaders;

function resizeHeaders()
{
  var headers = document.getElementsByClassName("column-header");
  
  var maxHeight = 0;
  for(var i = 0; i < headers.length; i++)
  {
    if(maxHeight < headers[i].offsetHeight)
      maxHeight = headers[i].offsetHeight;
  }
  
  for(var i = 0; i < headers.length; i++)
  {
    headers[i].style.height = maxHeight+"px";
  }
}
.column-stack {
  display: -ms-flexbox;
  display: flex;
  -ms-flex-pack: justify;
  justify-content: space-between;
  padding: 30px
}

.column-stack ul {
  -ms-flex: none;
  flex: none;
  width: calc(33.333% - 10px);
}

.column-stack ul .column-header {
  font-size: 12px;
  text-transform: uppercase;
  color: #006a4d;
  font-weight: 500;
  padding-bottom: 5px;
  border-bottom: 1px solid #3a3a3a;
  display: flex;
  align-items: stretch;
  /* Default */
  justify-content: space-between;
}
<div class="column-stack">
  <ul>
    <li class="column-header">Header 1 One Line</li>
    <li>Item 1</li>
    <li>Item 2</li>
    <li>Item 3</li>
    <li>Item 4</li>
  </ul>
  <ul>
    <li class="column-header">Header 2 Many Lines of Text this is many lines of text and is the longest column wow it keeps going and going and going like the energizer rabbit</li>
    <li>Item 1</li>
    <li>Item 2</li>
    <li>Item 3</li>
    <li>Item 4</li>
  </ul>
  <ul>
    <li class="column-header">Header 3 Two Line at most on most use cases</li>
    <li>Item 1</li>
    <li>Item 2</li>
    <li>Item 3</li>
    <li>Item 4</li>
  </ul>
</div>

8
задан James McMahon 6 April 2009 в 15:47
поделиться

8 ответов

Вы можете - отчасти: сделайте свой объект доступным, и затем расположите его сами.

Руководство удаляет, вряд ли улучшит производительность памяти в управляемой среде. Могло бы помочь с неуправляемыми ресурсами, что располагает, все о.

У меня были бы реализация и потребление Доступных объектов сделанными легче. У меня нет последовательной, полной идеи, как это должно быть похожим, но управление неуправляемыми ресурсами является подробной болью под.NET.


Идея для реализации удаляет: удалите отмечает объект для ручного удаления. В следующем цикле сборки "мусора" удален объект, и все ссылки на него устанавливаются в NULL.

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

3
ответ дан 5 December 2019 в 22:21
поделиться

Со сборкой "мусора", пока у Вас есть ссылка, на которую ссылаются, на объект, это остается в живых. С руководством удаляют Вас, не может гарантировать это.

Пример (псевдокод):

obj1 = new instance;
obj2 = obj1;

// 

delete obj2;
// obj1 now references the twilightzone.

Только быть коротким, комбинируя ручное управление памятью со сборкой "мусора" побеждает цель GC. Кроме того, почему беспокойство? И если Вы действительно хотите иметь контроль, используйте C++ и не C#.;-).

2
ответ дан 5 December 2019 в 22:21
поделиться

Chris Sells также обсудил это на Скалах.NET. Я думаю, что это было во время его первого выступления, но предмет, возможно, был пересмотрен в более поздних интервью.

http://www.dotnetrocks.com/default.aspx?showNum=10

0
ответ дан 5 December 2019 в 22:21
поделиться

Лучшим, который Вы могли получить, будет раздел в два “полушария”, где одним полушарием управляют и может гарантировать отсутствие висячих указателей. Другое полушарие имеет явное управление памятью и не дает гарантий. Эти два могут сосуществовать, но не, Вы не можете дать свои сильные гарантии второму полушарию. Все, что Вы могли сделать, должно отследить все указатели. Если Вы удалены, то все другие указатели на тот же экземпляр могли быть обнулены. Само собой разумеется, это довольно дорого. Ваша таблица помогла бы, но представила бы другие затраты (двойная косвенность).

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

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

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

Однако проблема заключается здесь:

String s = "Here is a string."; 
String t = s;
String u = s;
junk( s );

Что делает t и u точка к? В строгой ссылочной системе, t и u должен быть null. Таким образом, это означает, что необходимо не только сделать подсчет ссылок, но возможно отслеживающий также.

Однако я вижу, что необходимо быть, покончили s в этой точке в Вашем коде. Так junk может установить ссылку в NULL и передать его щетке со своего рода кодом приоритета. Gc мог быть активирован для ограниченного выпуска и памяти, освобожденной только если не достижимый. Таким образом, мы не можем явно освободить ничего, что кто-то кодировал для использования в некотором роде снова. Но если s единственная ссылка, затем блок освобожден.

Так, я думаю, что это только работало бы с ограниченным соблюдением явной стороны.

0
ответ дан 5 December 2019 в 22:21
поделиться

Это возможно и уже реализовано в неуправляемых языках, таких как C ++. По сути, вы реализуете или используете существующий сборщик мусора: когда вам нужно ручное управление памятью, вы вызываете new и delete как обычно, а когда вам нужна сборка мусора, вы вызываете GC_MALLOC или любую другую функцию или макрос для вашего сборщика мусора.

См. http://www.hpl.hp.com/personal/Hans_Boehm/gc/ для примера.

Поскольку вы использовали C # в качестве примера, возможно, вы имели в виду только реализацию руководства управление памятью на управляемом языке, но это должно показать вам, что возможно обратное.

0
ответ дан 5 December 2019 в 22:21
поделиться

Я думаю, что фундаментально проблема заключается в том, что свойства являются просто синтаксическим сахаром для поля с необязательными методами getter/setter. Автоматические свойства генерируют резервное поле, так что они требуют «установщика», или нет пути установить значение резервного поля. Поскольку свойства действительно сопоставляются с методами, а не с полями, нет смысла делать их только для чтения .

Даже если это разрешено, только для чтения может применяться только к автоматическим свойствам. Для традиционных свойств можно поместить произвольный код как в получатель, так и в установщик. Даже если установщик можно было вызвать только в конструкторе класса, получатель все равно может мутировать значение, основываясь на любой логике, которую вы решили поместить в него. Это полностью противоречило бы концепции readonly , что потребовало бы различных синтаксических правил и поддержки автоматических/традиционных свойств. Поскольку существует механизм - использование традиционных свойств только с определённым получателем И только для чтения поля как в упомянутом вопросе, - я не вижу смысла подгонять синтаксис свойств и потенциально вводить путаницу для чего-то с довольно легкой и простой реализацией с использованием текущих языковых конструкций.

-121--2074927-

Методы класса, такие как unittest.StartCase.assertEqual , не выполняются вне контекста, предоставленного экземпляром этого класса. Таким образом, последовательность, как ваш 'assertEqual (b, 5)' на самом деле очень, ОЧЕНЬ плохой случай - обратите внимание, что последовательность, написанный никогда не будет никогда выполняться должным образом (вам нужно, по крайней мере, добавить что-то вроде 'я'. , а затем я нужно сделать в экземпляр класса и т.д.,

Я не уверен точно, почему вы хотите поддерживать такие катастрофические конструкции, но, если вы непреклонны, что вы делать любой ценой хотите, то это общая идея: сделать экземпляр класса unittest.Testcase , добавить имя экземпляра-ссылки и точку к этому ряду, и выполнить , что соединение последовательности. Затем, конечно, вы попадаете во все виды других забавных требований, таких как поймать исключение, которое может вырасти (так как у вас на самом деле нет тестового бегуна для выполнения всех таких хозяйственных задач для вас). Йек.

-121--5086298-

Если семантика удаления ссылки на объект делает все остальные ссылки, ссылающиеся на этот объект, пустыми, то это можно сделать с 2 уровнями косвенности (на 1 больше, чем вы намекаете). Следует отметить, что в то время как базовый объект будет уничтожен, фиксированный объем информации (достаточный для хранения ссылки) должен находиться в реальном времени в куче.

Все ссылки, используемые пользователем, будут ссылаться на скрытую ссылку (предположительно, живущую в куче) на реальный объект. При выполнении какой-либо операции над объектом (например, вызов метода или использование его идентификатора)wuch как с использованием оператора = =), ссылка, которую использует программист, будет смещать скрытую ссылку, на которую он указывает. При удалении объекта фактический объект будет удален из кучи, а скрытая ссылка будет иметь значение null. Таким образом, ссылочные программисты увидят значение, равное null.

GC должен очистить эти скрытые ссылки.

0
ответ дан 5 December 2019 в 22:21
поделиться

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

В таких ситуациях все было бы гораздо проще, если бы существовал способ явного удаления объектов или, по крайней мере, способ переместить граф объектов назад к поколению 0.

.
0
ответ дан 5 December 2019 в 22:21
поделиться
Другие вопросы по тегам:

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