Модель памяти в C ++: почему два целых числа в структуре расположены в одной и той же ячейке памяти? - PullRequest
2 голосов
/ 21 марта 2019

Обращаясь к фрагменту кода на cppreference.com , который я вставляю ниже, почему целые числа b и c расположены в одной и той же ячейке памяти:

struct S {
    char a;     // memory location #1
    int b : 5;  // memory location #2
    int c : 11, // memory location #2 (continued)
          : 0,
        d : 8;  // memory location #3
    struct {
        int ee : 8; // memory location #4
    } e;
} obj; // The object 'obj' consists of 4 separate memory locations

Насколько я понимаю, например, в системе, в которой 1 байт = 8 бит, переменная a будет занимать 1 байт.Тогда b займет, скажем, 4 байта.Если и b, и c находятся в одной и той же ячейке памяти, которая будет заполнять 8 байтов, означает ли это, что 8 char переменных могут быть размещены в одной и той же ячейке памяти в непрерывном режиме?

Кроме того,как программа узнает, куда обращаться к b или c, если они имеют одинаковое расположение в памяти?

1 Ответ

6 голосов
/ 21 марта 2019

Вы пропустили :5 и :11.
Убедитесь, что знаете, что они делают.Это синтаксис для создания битовых полей.(Спасибо Нейту за напоминание об утомленном мне термине и за предоставление полезной ссылки https://en.cppreference.com/w/cpp/language/bit_field) По сути, они говорят, что "нужно всего 5 и 11 бит, не стесняйтесь втиснуть их в один int".
Предполагается, что вполне вероятно, что int составляет по крайней мере 16 бит (для сжатия двух) или по крайней мере 24 бит (для сжатия третьего дюйма) в вашей среде.

Когда вы говорите «та же область памяти»Это как бы правильно, они находятся в одном (вероятно) 32-битном месте, но не совсем в одной и той же памяти.Они в разных битах.Таким образом, система получает к ним доступ каким-либо образом (в зависимости от аппаратного обеспечения и не определяется), который использует только часть битов.Вы можете думать об этом как о компиляторе / ЦП, выполняющих некоторые сдвиги и маскирование, но просто как модель того, что происходит.

...