что двоеточие используется в struct def mean в C ++? [Дубликат]

Исправить исключение 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.

Для получения дополнительной информации: Операторы с нулевым условием

7
задан Donal Fellows 6 July 2010 в 15:52
поделиться

5 ответов

Поскольку 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-битном выравнивании.

11
ответ дан Mark Rushakoff 25 August 2018 в 01:44
поделиться

Битвые поля широко используются в прошивке для отображения различных полей в регистрах. Это сэкономит много ручных побитовых операций, которые были бы необходимы для чтения / записи полей без него. Одним из недостатков является то, что вы не можете принимать адреса битполей.

0
ответ дан Parshuram Thombare 25 August 2018 в 01:44
поделиться

Его C.

Ваш компьютер округляет выделение памяти до 12 байтов для целей выравнивания. Большинство подсистем памяти компьютера не могут обрабатывать байтовую адресацию.

0
ответ дан Remy 25 August 2018 в 01:44
поделиться

Ваша программа работает точно так, как я ожидал. Компилятор выделяет соседние битовые поля в одно и то же слово памяти, но ваше разделяется небитовым полем.

Перемещайте битовые поля рядом друг с другом, и вы, вероятно, получите 8, размер которых равен двум ints на вашей машине. Битовые поля будут упакованы в один int. Однако это компилятор.

Битвые поля полезны для экономии места, но не более того.

0
ответ дан Richard Pennington 25 August 2018 в 01:44
поделиться

1) Они возникли в C, но, к сожалению, также являются частью C ++.

2) Да или внутри класса в C ++.

3) Также как и сохранение памяти, они могут использоваться для некоторых форм бит-скручивания. Тем не менее, как сохранение памяти, так и скручивание по своей сути зависят от реализации - если вы хотите написать портативное программное обеспечение, избегайте битных полей.

7
ответ дан user 25 August 2018 в 01:44
поделиться
  • 1
    Для downvoter - с каким из этих высказываний вы не согласны? – user 15 January 2010 в 13:11
  • 2
    +1: «зависимые от реализации» и «избегать бит-полей» являются ключевыми. – David Rodríguez - dribeas 15 January 2010 в 14:50
  • 3
    Я частично не соглашусь здесь в отношении экономии памяти: не стесняйтесь указывать битовые поля, где они могут уменьшить объем памяти в структуре. Но никогда не пытайтесь быть умными с ними и семь раз никогда не рассчитывайте на то, что компилятор будет с ними делать. – dmckee 16 January 2010 в 04:17
  • 4
    Пока базовый тип битового поля является неподписанным типом, арифметические свойства битового поля хорошо определены и одинаковы везде. Например, если у вас есть бит unsigned x : 4;, то вычисления в x всегда выполняются по модулю 16. – caf 18 January 2010 в 00:16
  • 5
    Во встроенных битах кода часто важны для написания эффективного кода, например. переключение битов в порт вывода с отображением памяти. Порт определяется как поле бит, а отдельные контакты порта управляются путем установки значения бит в 1 или 0. Это делает код легко поддерживаемым. Выделение портов оборудования может быть изменено на 1 место в коде. Если у процессора есть инструкции по манипулированию бит (многие делают), то компилятор, скорее всего, их использует. Альтернативой является использование масок с операцией AND / OR. Это сложнее поддерживать, менее читаемо и, вероятно, создавать менее эффективный код. – user1582568 21 December 2015 в 21:42
Другие вопросы по тегам:

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