Выравнивание структуры

97
01 апреля 2022, 13:50

Есть структура _dem_ram_data_. Она должна занимать в памяти 16 байт, но я получаю 21 байт. Использую на 64 разрядной системе.

#include <iostream>
typedef unsigned long       ViUInt32;
typedef long                ViInt32;
typedef unsigned char       ViUInt8;
typedef unsigned long long  ViUInt64;
#pragma pack(push,1)
typedef struct _dem_ram_data_{ 
    union {
        struct {
            ViUInt32 errors     : 32;
            ViInt32  addr       : 27;
            ViUInt8 _reserve    : 2;    
            ViUInt8 dataType    : 2;
            ViUInt8 graphEna    : 1;
        } vecAddr;
        struct {
            ViUInt64 tact       : 42;
            ViUInt32 _reserve   : 19;   
            ViUInt8 dataType    : 2;
            ViUInt8 graphEna    : 1;
        } tact;
         ViUInt64 d;
    } demData;
    ViUInt32 cpl;
    ViUInt32 cph;
} DemRamData, *PDemRamData;  
#pragma pack(pop)
using namespace std;
int main()
{
    cout << sizeof(DemRamData) << endl;
    return 0;
}
Answer 1

Проблема решена заменой разных типов с битовыми полями на один. Спасибо!

#pragma pack(push,1)
typedef struct _dem_ram_data_{ // $DC
    union {
        struct {
            ViUInt64 errors     : 32;
            ViUInt64  addr      : 27;
            ViUInt64 _reserve    : 2;    
            ViUInt64 dataType    : 2;
            ViUInt64 graphEna    : 1;
        } vecAddr;
        struct {
            ViUInt64 tact       : 42;
            ViUInt64 _reserve   : 19;  
            ViUInt64 dataType    : 2;
            ViUInt64 graphEna    : 1;
        } tact;
         ViUInt64 d;  // data
    } demData;
    ViUInt32 cpl;
    ViUInt32 cph;
} DemRamData, *PDemRamData;
#pragma pack(pop)
READ ALSO
QML не реагирует на изменения члена-класса C++

QML не реагирует на изменения члена-класса C++

Есть приложение с областью, которая реагирует на клик мышки:

106
Почему ошибка index out of range?

Почему ошибка index out of range?

Числовая последовательность называется пилообразной если каждый ее член (кроме первого и последнего) либо больше обоих своих соседей, либо...

96
Установка пустого атрибута ACCESS_EXTERNAL_DTD вызывает исключение &quot;не поддерживается: http://javax.xml.XMLConstants/property/accessExternalDTD&quot;

Установка пустого атрибута ACCESS_EXTERNAL_DTD вызывает исключение "не поддерживается: http://javax.xml.XMLConstants/property/accessExternalDTD"

Установка пустого атрибута ACCESS_EXTERNAL_DTD вызывает исключение "не поддерживается: http://javaxxml

71
Замена иконки бургера на стрелочку

Замена иконки бургера на стрелочку

Получилось синхронизировать состояние бокового меню с кнопкой бургера через ActionBarDrawerToggleТ

102