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

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

Почему?

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

Ответ 1

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

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

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

Edit:
Вот результат теста, который я сделал на своей 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 байт есть прыжок, где время внезапно увеличивается в четыре раза, когда размер удваивается. То, что резерв начнет использоваться.

Ответ 2

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

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