Когато присвоите екземпляр от тип стойност на друг екземпляр, обектът се копира малко по бит в целевото местоположение:
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');
Забележка: Не се опитвам да микрооптимизирам нищо.
Редактиране: Същността на моя въпрос е, както го казва Лий: Структурите директно ли се разпределят на място или трябва да бъдат разпределени и след това копирани?