Что особенного в отношении int: 0 в C ++ - PullRequest
4 голосов
/ 22 января 2020
struct S {
    char a;         // location #1
    int b:5,        // location #2
    int c:11,
    int :0,         // note: :0 is "special"
    int d:8;        // location #3
    struct {int ee:8;} e;   // location #4
};

Кажется, что переменная-член int: 0 структуры не занимает никакого места в памяти и помечена как: // note:: 0 является "особенной"

Кто-нибудь знает, что это специальное использование int: 0 здесь? Спасибо

PS: пример кода указан от http://www.stroustrup.com/C++11FAQ.html#memory -модель

Ответы [ 3 ]

9 голосов
/ 22 января 2020

int:0; объявляет битовое поле нулевой ширины.

Это не занимает памяти, но явно отделяет битовые поля, объявленные до него, от битовых полей, объявленных впоследствии, в отдельные области памяти.

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

В вашем примере b и c занимают одно и то же место в памяти, поэтому вы не можете иметь один поток доступа b в то время как другой обращается к c. С другой стороны, битовое поле нулевой ширины гарантирует, что d является отдельной ячейкой памяти, поэтому к b и d можно обращаться одновременно из отдельных потоков без синхронизации.

Без нулевой ширины битовое поле, на 32-битных или 64-битных платформах вполне вероятно, что компилятор сделает b, c и d частью одного машинного слова, поэтому безопасный параллельный доступ будет невозможен без специальных инструкций, тогда как при битовое поле нулевой ширины, компилятор должен гарантировать, что они хранятся в отдельных машинных словах, или соответствующие инструкции используются для обеспечения безопасности одновременного доступа.

4 голосов
/ 22 января 2020

С https://en.cppreference.com/w/cpp/language/bit_field

Нулевое значение допускается только для безымянных битовых полей и имеет специальное значение: оно указывает, что следующее битовое поле в определении класса начнется с граница единицы размещения.

0 голосов
/ 22 января 2020

И, чтобы процитировать исходный стандарт C ++ (ISO / IEC 14882, первое издание 1998-09-01, раздел 9.6 «Битовые поля» [class.bit] пункт 2).

В особом случае безымянное битовое поле с нулевой шириной задает выравнивание следующего битового поля на границе единицы выделения. Только при объявлении безымянного битового поля константное выражение может быть значением, равным нулю.

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

На сегодняшний день каждый последующий стандарт C ++ (и черновик) имеет одинаковую формулировку. Что может, хотя бы частично, объяснить, что 0 является «особой» запиской.

...