Накладные расходы на использование структур как оболочек для примитивов для проверки типов?
Скажем, я хочу получить дополнительную проверку типов для работы с примитивами, которые подразумевают разные вещи семантически:
public struct Apple
{
readonly int value;
// Add constructor + operator overloads
}
public struct Orange
{
readonly int value;
// Add constructor + operator overloads
}
Суть в том, что мы не можем сравнивать "яблоки с апельсинами", поэтому обертывание фактического int в структуре означает, что мы получаем проверку типов и некоторую дополнительную читаемость и документацию по коду.
Мой вопрос: каковы накладные расходы, связанные с этим, как с точки зрения памяти, так и с точки зрения скорости? Поскольку structs являются типами значений, будут ли переменные, содержащие эти структуры, 32 бита или больше? Что касается служебных издержек использования этих структур вместо примитивов - есть ли большие накладные расходы для перегрузки оператора?
Любые другие советы по мудрости этого?
Ответы
Ответ 1
В памяти нет накладных расходов, используя структуру, которую вы можете проверить с помощью Marshal.SizeOf()
:
struct testStruct
{
public readonly int value;
}
..
int size = Marshal.SizeOf(typeof(testStruct)); //returns 4
Это также то же самое, что возвращается sizeof(testStruct)
:
unsafe
{
int size = sizeof(testStruct); //returns 4
}
В соответствии с MSDN разница между двумя методами калибровки:
Хотя вы можете использовать Marshal.SizeOf метод, значение возвращенный этим методом, не всегда то же самое, что и значение, возвращаемое размер. Marshal.SizeOf возвращает размер после того, как тип был marshaled, тогда как sizeof возвращает размер, который был выделен времени выполнения общего языка, включая любые обивка.
Ответ 2
Я, вероятно, избегу этого, но вы могли бы сделать:
using Apple = System.Int32;
using Orange = System.Int32;
Вы не сможете использовать его в файлах. И технически вы можете сравнить яблоки с апельсинами.