Когда вы назначаете экземпляр типа значения другому экземпляру, объект побитно копируется в целевое местоположение:
private struct Word
{
public Word(char c) { ... }
}
public void Method(Word a)
{
Word b = a; //a is copied and stored in b
}
Но учитывая следующий код:
private Word _word;
public void Method() {
_word = new Word('x');
}
Я подозреваю, что сначала вычисляется правостороннее (RHS) выражение, которое создает экземпляр типа значения в стеке, а затем значение копируется и сохраняется в местоположении поля _word
, которое на куче.
В качестве альтернативы можно было бы принять во внимание левую часть и создать экземпляр типа значения непосредственно в _word
, избегая необходимости копировать объект.
Правильно ли мое подозрение? Если это так, я полагаю, можно с уверенностью предположить, что первый блок кода будет работать лучше, чем второй.
//1 instantiation + 10k copies
Word[] words = new Word[10000];
Word word = new Word('x');
for (int i = 0; i < 10000; i++)
words[i] = word;
//10k instantiations + 10k copies
Word[] words = new Word[10000];
for (int i = 0; i < 10000; i++)
words[i] = new Word('x');
Примечание. Я не пытаюсь ничего микрооптимизировать.
Редактировать. Суть моего вопроса, как выразился Ли, заключается в том, выделяются ли структуры непосредственно на месте или их нужно выделять, а затем копировать?