Можно ли использовать «a = new type (...);» где тип - это небольшая структура в процедурах - PullRequest
1 голос
/ 27 марта 2012

Я думал о том, как будет обрабатываться память в каком-то конкретном случае, который я объясню ( C # 4.0 ).

Для начала я прочитал Эрик Липперт ответ, чтобы знать, что будет вызываться всякий раз, когда я использую new для переменной типа struct

А теперь мне интересно,компилятор «создает» интеллектуальный код при конкретном использовании ключевого слова new

Если быть точным, что он будет делать, если new установлен на return инструкция или даже оператор = ?

Предположим, у нас есть структура Coord, определенная следующим образом:

struct Coord {
    int x, y;
    public Coord(int xx, int yy) {
        x = xx;
        y = yy;
    }
}

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

Entity определяется следующим образом:

class Entity {
    private Coord m_pos, m_vel;
    //...
    public Entity() {
        // ...
    }

    public Coord Position {
        get {
            return m_pos;
        }
        set {
            m_pos = value;
        }
    }

    public Coord Velocity {
        get {
            return m_vel;
        }
        set {
            m_vel = value;
        }
    }
}

Моя основная программа содержит подпрограмму, которая просто обновляет мои сущности (ипоэтому их положение и скорость)

Теперь мой вопрос: какова цена, если я будуЧтобы обновить эти 2 элемента, используйте new :

Entity a; // initialized

...

private Coord getNewPosOf(Entity e) {
   ...
   return new Coord(computed_x, computed_y);
}

public void routine() {
    a.Velocity = new Coord(x_vel, y_vel);
    a.Position = getNewPosOf(a);
}

Будет ли этот код выделять память в кратковременном хранилище и, следовательно, также копировать значения из конструктора в область памятио.Или компилятор позаботится о вещах и не будет выделять и копировать память в этом конкретном случае?

Примечание: у меня такое ощущение, что я делаю что-то не так, возможно, мне не следует использовать свойства для редактирования моего Coord-введите члены (или, что еще хуже, я не могу правильно использовать Свойства, и есть другой способ сделать то, что я хочу)

1 Ответ

3 голосов
/ 27 марта 2012

Интересно, «компилирует ли» компилятор интеллектуальный код при конкретном использовании нового ключевого слова. Если быть точным, что он будет делать, если новое установлено в инструкции возврата или даже в операторе =?

Прежде всего вы должны уточнить, какой "компилятор" вы имеете в виду. Компилятор C #, который компилирует C # в IL, или Jit-компилятор, который компилирует IL в машинный код?

Если вы хотите узнать, что делает компилятор C # , попробуйте и посмотрите . Используйте ILDASM для просмотра вывода компилятора C #. Помните, что ключ / optimize может в некоторых случаях существенно изменить то, что генерируется IL.

Чтобы увидеть, какой код генерирует джиттер, сначала решите, какой джиттер вам подходит; Компактный каркас, 32-битный рабочий стол, 64-битный рабочий стол, Silverlight и т. д. имеют разные дрожания.

Затем решите, заинтересованы ли вы в отладочных выходных данных джиттера или полностью оптимизированных выходных данных.

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

...