Если вы объявили struct:
struct EmptyResult
{
}
Каков результат создания переменной типа EmptyResult
в экземпляре?
public Foo()
{
EmptyResult result;
}
Ожидаете ли вы распределение в стеке, или это эффективно не-op?
Если вы объявили struct:
struct EmptyResult
{
}
Каков результат создания переменной типа EmptyResult
в экземпляре?
public Foo()
{
EmptyResult result;
}
Ожидаете ли вы распределение в стеке, или это эффективно не-op?
Компилятор С# заставляет пустую структуру иметь размер 1 байт. Вы можете увидеть это, если вы посмотрите на структуру в декомпиляторе:
[StructLayout(LayoutKind.Sequential, Size=1)]
private struct EmptyResult
{
}
Таким образом, любой экземпляр этой структуры в классе или в стеке будет занимать 1 байт, точно так же, как экземпляр System.Byte
или System.SByte
Структура С# без полей по-прежнему имеет размер 1. Причина в том, что компилятор должен иметь возможность принимать адрес структуры с помощью оператора &
в небезопасном коде.
Я ожидал бы, что ваш тип структуры будет обрабатываться точно так же, как тип byte
.
Я думаю, что это распределение стека, что соответствует тому, как работают не ссылочные типы.
Если вы используете idlasm.exe
для изучения il, в строке, в которой вы создаете экземпляр структуры Empty
, вы увидите:
.maxstack 1
.locals init ([0] valuetype Draft.Empty e)
И определение Empty
struct:
.class private sequential ansi sealed beforefieldinit Draft.Empty
extends [mscorlib]System.ValueType
{
.pack 0
.size 1
} // end of class Draft.Empty
Как вы видите, он выделяет 1 байт при создании времени, а в определении размер этого типа равен 1.
Так что да; он выделяет 1 байт в стеке.
Примечание: определение Empty
извлечено из скомпилированной сборки в режиме выпуска.