Сколько экземпляров ValueType создает MichaelJordan в стеке в .NET? - PullRequest
2 голосов
/ 19 марта 2011

Я немного озадачен тем, как ValueType объекты управляются с точки зрения памяти в .NET. Я получаю, что типы значений помещаются в стек для каждого экземпляра / объявления. Я не совсем уверен, что представляет собой новый экземпляр / объявление. Я думаю, что мой главный вопрос:

Если я передаю параметр ValueType методу, но не присваиваю ему значение, создается ли новый экземпляр в стеке?

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

void Main()
{
    //-------------------------|  Line 1:
    int MichaelJordan = 23;      
    //-------------------------|  Line 2:   
    int HoursInADay = 24;           
    //-------------------------|  Line 3:
    Console.WriteLine("Michael Jordan is "+(NumberHelper.Is23(MichaelJordan) ? string.Empty : "not ")+"23");
    //-------------------------|  Line 4:
    Console.WriteLine("The last number that wasn't 23 was "+NumberHelper.LastNumberThatWasnt23);
    //-------------------------|  Line 5:
    Console.WriteLine("Hours in a Day is "+(NumberHelper.Is23(HoursInADay) ? string.Empty : "not ")+"23");
    //-------------------------|  Line 6:  
    Console.WriteLine("The last number that wasn't 23 was "+NumberHelper.LastNumberThatWasnt23);
}

public static class NumberHelper {  
    public static int LastNumberThatWasnt23;
    public static bool Is23(int candidate){
        if(candidate != 23){
            LastNumberThatWasnt23 = candidate;
            return false;
        }
        return true;
    }
}

Итак, вот мои вопросы относительно программы.

  1. Сколько целочисленных экземпляров создается в стеке в этой программе?

  2. Где именно в коде каждый экземпляр типа значения создается в стеке?

Хотя есть большая вероятность, что я ошибаюсь, это то, что я думаю, и то, в чем я не уверен.

  • Строка 1: Я знаю, что в стеке создан новый экземпляр переменной MichaelJordan

  • Строка 2: Я знаю, что в стеке создан новый экземпляр переменной HoursInADay

  • Строка 3: Копия экземпляра значения из переменной MichaelJordan, созданной в чтобы быть параметром метода? Создан ли экземпляр для сравнения со значением 23?

  • Строка 4: Значение для поля LastNumberThatWasnt23 не инициализировано, поэтому оно возвращает значение по умолчанию. Для этого поля создан новый экземпляр со значением по умолчанию?

  • Строка 5: Те же вопросы, что и в строке 3, но я также знаю, что в стеке создается новый экземпляр для поля LastNumberThatWasnt23, потому что я его настраиваю.

  • Строка 6: Теперь поле имеет значение. Но, ссылаясь на это значение и передавая его в метод Console.WriteLine, я создаю новый экземпляр значения в стеке?

У меня есть еще одна часть к этому вопросу, а именно Как бы я узнал такие вещи? Могу ли я сделать это программно? Есть ли какие-либо инструменты, которые можно использовать для раскрытия такой информации?

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

Ответы [ 3 ]

3 голосов
/ 19 марта 2011

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

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

2 голосов
/ 19 марта 2011

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

Вы можете найти это, разобрав код asm (не IL).И даже тогда это зависит от флагов компилятора, наличия отладчика, точного содержания вашего метода, версии .net, ...

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

1 голос
/ 19 марта 2011

распределение памяти типов значений и ссылочных типов в .net framework должно отвечать на большинство, если не на все ваши вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...