Исправить исключение NullReferenceException можно с помощью Null-условных операторов в c # 6 и написать меньше кода для обработки нулевых проверок.
Он используется для проверки нуля до выполнения доступа к члену (?. ) или index (? [).
Пример
var name = p?.Spouse?.FirstName;
эквивалентен:
if (p != null)
{
if (p.Spouse != null)
{
name = p.Spouse.FirstName;
}
}
В результате имя будет нулевым когда p равно null или когда p.Spouse имеет значение null.
В противном случае имени переменной будет присвоено значение p.Spouse.FirstName.
Для получения дополнительной информации: Операторы с нулевым условием
Поскольку a
и c
не являются смежными, каждый из них резервирует пространство памяти полного int. Если вы перемещаете a
и c
вместе, размер структуры становится 8 байтами.
Кроме того, вы сообщаете компилятору, что хотите, чтобы a
занимал только 1 бит , а не 1 байт. Поэтому, хотя a
и c
рядом друг с другом должны занимать всего 3 бита (все еще под одним байтом), комбинация a
и c
по-прежнему выравнивается по словам в памяти на вашем 32-битном и, следовательно, занимая полные 4 байта в дополнение к int b
.
Аналогичным образом вы обнаружите, что
struct s{
unsigned int b;
short s1;
short s2;
};
занимает 8 байтов, а
struct s{
short s1;
unsigned int b;
short s2;
};
занимает 12 байтов, потому что в последнем случае два шорта каждый сидят в своем собственном 32-битном выравнивании.
Битвые поля широко используются в прошивке для отображения различных полей в регистрах. Это сэкономит много ручных побитовых операций, которые были бы необходимы для чтения / записи полей без него. Одним из недостатков является то, что вы не можете принимать адреса битполей.
Его C.
Ваш компьютер округляет выделение памяти до 12 байтов для целей выравнивания. Большинство подсистем памяти компьютера не могут обрабатывать байтовую адресацию.
Ваша программа работает точно так, как я ожидал. Компилятор выделяет соседние битовые поля в одно и то же слово памяти, но ваше разделяется небитовым полем.
Перемещайте битовые поля рядом друг с другом, и вы, вероятно, получите 8, размер которых равен двум ints на вашей машине. Битовые поля будут упакованы в один int. Однако это компилятор.
Битвые поля полезны для экономии места, но не более того.
1) Они возникли в C, но, к сожалению, также являются частью C ++.
2) Да или внутри класса в C ++.
3) Также как и сохранение памяти, они могут использоваться для некоторых форм бит-скручивания. Тем не менее, как сохранение памяти, так и скручивание по своей сути зависят от реализации - если вы хотите написать портативное программное обеспечение, избегайте битных полей.
unsigned x : 4;
, то вычисления в x
всегда выполняются по модулю 16.
– caf
18 January 2010 в 00:16