Почему структура лучше с тем, чтобы быть меньше чем 16 байтами

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

Почему?

Спасибо за любой ответ.

11
задан Ricky 13 March 2010 в 10:01
поделиться

2 ответа

Это связано с тем, что 16 байт - это порог, при котором компилятор начинает копирование структур в виде блока памяти вместо использования одной или двух простых инструкций перемещения.

Компилятор оптимизирует копирование структур, когда они маленькие. Например, структура размером восемь байтов может быть скопирована как одно 64-битное значение. Структура размером 16 байт может быть скопирована как одно или два единичных значения (в зависимости от архитектуры процессора). Когда размер структуры превышает 16 байт, компилятор больше не пытается оптимизировать перемещение, и откат заключается в вызове метода, копирующего блок памяти.

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

Изменить:
Вот результат теста, который я провел на моей 64-битной системе, копируя структуры полмиллиарда раз:

struct 4    : 272 ms.
struct 8    : 235 ms.
struct 16   : 317 ms.
struct 32   : 625 ms.
struct 64   : 1280 ms.
struct 128  : 4659 ms.
struct 256  : 8020 ms.

Как вы видите, меньше 16 байт время не является линейным, хотя 16 байт в четыре раза больше, чем 4 байта, это не занимает в четыре раза больше времени. Выше 16 байт время линейно, поэтому удвоение размера удваивает время. Вот где он начал бы использовать несколько ходов. Выше 64 байтов происходит скачок, при котором время внезапно увеличивается в четыре раза, когда размер удваивается. Вот где можно будет использовать запасной вариант.

31
ответ дан 3 December 2019 в 02:30
поделиться

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

4 года спустя: Я ответил на этот вопрос, зная очень мало о .NET (и до сих пор не знаю о нем почти ничего). Ответ Гуффа, очевидно, более правильный, когда речь идет о "больше или меньше 16 байт?", поскольку при таком размере немного копирования не должно иметь большого значения. Мой ответ может быть тем, что следует иметь в виду при создании огромных структур.

1
ответ дан 3 December 2019 в 02:30
поделиться
Другие вопросы по тегам:

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