__attribute__((__packed__))

151
12 ноября 2019, 17:20

Не совсем понимаю, что происходит при упаковке, например, структур.

Допустим:

#include <stdio.h>
#include <stdlib.h>
struct s
{
    int i;
    char c;
} __attribute__ ((__packed__));
int main()
{
    struct s arr[2];
    printf("sizeof(s): %Iu\n", sizeof(struct s));
    printf("sizeof(arr): %Iu\n", sizeof(arr));
    printf("%p\n", &(arr[1].i));
    return 0;
}

Вывод:

sizeof(s): 5
sizeof(arr): 10
0060FEFB

Получается, что начиная arr[1] поле i имеет неверное выравнивание, потому что адрес 0060FEFB не кратен sizeof(int). А согласно стандарту, работа с невыровненными данными - это неопределенное поведение. Например, если мы обратимся такому к полю i через указатель (->, *), то получим неопределенное поведение.

Answer 1

Доступ к невыровненым данным формально приводит к неопределенному поведению. Однако С/С++ реализации могут предоставлять такой доступ в качестве расширения. При этом реализации делятся на несколько типов по отношению к выравниванию.

  1. Выравнивание требуется на уровне аппаратуры. Реализация не предпринимает никаких мер для обхода требований аппаратуры. Попытка доступа к невыровненным данным приводит к аварийному завершению программы.

  2. Выравнивание требуется на уровне аппаратуры. Реализация выполняет безопасный (по частям) доступ к потенциально невыровненным данным. Доступ к потенциально невыровненным данным возможен, но существенно менее производителен.

  3. Выравнивание не требуется на уровне аппаратуры. Реализации не надо ни о чем беспокоиться. Доступ к потенциально невыровненным данным возможен, но обычно несколько менее эффективен.

Вы скорее всего имеете дело с реализацией типа 3.

См. также О чём говорит предупреждение о выравнивании данных?

READ ALSO
Qt QMessageBox, как задать имя для кнопки &ldquo;Show details&rdquo;

Qt QMessageBox, как задать имя для кнопки “Show details”

собственно вопрос в шапке: Как задать имя конкретно для кнопки "Show details", с другими кнопками проблем нет

120
hibernate SessionFactory и CriteriBuilder

hibernate SessionFactory и CriteriBuilder

Здраствуйте! Есть сущность

132
resize в scene builder javafx

resize в scene builder javafx

ЗдраствуйтеУ меня такая проблема

125
Retrofit и SharedPreferences: Как сохранить полученный токен?

Retrofit и SharedPreferences: Как сохранить полученный токен?

Не получается сохранить токенВ файле preferences

150