"Куча" по сравнению с последствиями выделения Стека (.NET)

Чтобы перейти к формату оси Y в процентах, используйте пакет scales. Я дал ответ на то же самое здесь: Столпчатый столбец с процентами в R ggplot2 для категориальных переменных с нуля

library(tidyverse)
library(scales)
 IC %>% 
  mutate(morning=as.factor(morning),number=as.numeric(number)) %>% 
  ggplot(aes(station,number,fill=morning))+geom_bar(stat="identity",position = "fill")+
 scale_y_continuous(labels=scales::percent_format(),breaks=scales::pretty_breaks(n=10))+
  scale_fill_manual(values=c('#999999','#E69F00'))

21
задан Community 23 May 2017 в 12:34
поделиться

4 ответа

Пока Вы знаете, какой семантика, единственные последствия стека по сравнению с "кучей" с точки зрения проверки, что Вы не переполняете стека и быть знающим, что существует стоимость, связанная со сборкой "мусора" "кучи".

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

Аналогично компилятор C# мог решать выделить все локальные переменные на "куче" - стек просто содержал бы ссылку на экземпляр MyMethodLocalVariables, и весь переменный доступ будет реализован через это. (На самом деле переменные, полученные делегатами или блоками итератора уже, имеют этот вид поведения.)

18
ответ дан 29 November 2019 в 20:55
поделиться

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

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

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

Это имеет отношение, как выделения "кучи" обрабатываются для C / C++. На самом деле выделение "кучи" довольно быстро в.NET (кроме тех случаев, когда это инициировало мусор, собираются), поэтому даже если Вы могли бы решить, где выделить, мое предположение - то, что разница не была бы значительной.

Однако, так как "куча" собрана "мусор", и стек не, очевидно, Вы видели бы некоторые различия в определенных случаях, но это едва релевантно учитывая тот факт, что у Вас действительно нет выбора в.NET.

4
ответ дан 29 November 2019 в 20:55
поделиться

( редактирование: Мой исходный ответ содержал упрощение "структуры, выделяются на стеке" и запутанном стеке по сравнению с "кучей", и значение по сравнению со ссылкой касается немного, потому что они связаны в C#. )

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

public class Foo
{
   public int X = 0;
}

Теперь рассматривают следующий код:

Foo foo = new Foo();
Foo foo2 = foo;
foo2.X = 1;

В этом примере, нечто и foo2 являются ссылками на тот же объект. Установка X на foo2 будет также влиять на foo1. , Если мы изменяем класс Foo на структуру тогда, это больше не имеет место . Это вызвано тем, что к структурам не получают доступ через ссылки. Присвоение foo2 на самом деле сделает копию.

Одна из причин помещения материала на стеке - то, что сборщик "мусора" не должен очищать его. Вы обычно не должны волноваться о таких вещах; просто используйте классы! Современные сборщики "мусора" делают довольно хорошее задание. Некоторые современные виртуальные машины (как java 1.6) могут даже определять, безопасно ли выделить объекты на стеке , даже если они не типы значения.

4
ответ дан 29 November 2019 в 20:55
поделиться

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

3
ответ дан 29 November 2019 в 20:55
поделиться
Другие вопросы по тегам:

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