Большая разница в размере структуры на разных системах и разрядностях, компиляторах

226
30 января 2019, 22:30

Присутствует сруктура из си заголовка, такого вида:

typedef struct AVCodecDescriptor {
    int      id;
    int type;
    /**
     * Name of the codec described by this descriptor. It is non-empty and
     * unique for each codec descriptor. It should contain alphanumeric
     * characters and '_' only.
     */
    const char      *name;
    /**
     * A more descriptive name for this codec. May be NULL.
     */
    const char *long_name;
    /**
     * Codec properties, a combination of AV_CODEC_PROP_* flags.
     */
    int             props;
    /**
     * MIME type(s) associated with the codec.
     * May be NULL; if not, a NULL-terminated array of MIME types.
     * The first item is always non-NULL and is the preferred MIME type.
     */
    const char *const *mime_types;
    /**
     * If non-NULL, an array of profiles recognized for this codec.
     * Terminated with FF_PROFILE_UNKNOWN.
     */
    const struct AVProfile *profiles;
} AVCodecDescriptor;

При подсчете на пальцах, на x86 системе, размер структуры равен 28 байт, следовательно, на x64 размер должен перемножаться на 2, но в итоге при вызове sizeof получаем не 56 байт, а 48.

Почему так происходит и как такое может отразиться при использовании таких размеров для структуры .net?

P.S. Разные компиляторы отдали одно и тоже значение:

gcc x64 : Size of AVCodecDescriptor is: 48 bytes

mingw32 : Size of AVCodecDescriptor is: 28 bytes

cygwin x64 : Size of AVCodecDescriptor is: 48 bytes

Как правильно подойти к решению данной задачи, дабы не лезть за пределы памяти структуры, и так что бы размер структуры не был слишком велик?

Answer 1

int что на 32, что на 64 разрядах будет 4 байта. Поменяется только размер указателя + возможное выравнивание на 8 байт.

Если очень нужно ужаться (так ли уж важны вам эти байты?), то используйте выравнивание на 4 байта - будет 44 байта.

READ ALSO
Как можно скомпилировать C++ Linux/Android/etc программу из-под Windows?

Как можно скомпилировать C++ Linux/Android/etc программу из-под Windows?

Вопрос в заголовкеКак можно скомпилировать бинарник для использования на Linux/Android/etc, используя Windows? Для сборки использую make, но, вроде, gcc не умеет...

238
Тип bool в шейдерах DirectX11

Тип bool в шейдерах DirectX11

Имею DirectX11 и небольшой движокЧто хочу сделать - отправить в вершинный шейдер структурный буфер собственного типа(в типе единственный член,...

185
Для чего нужно (char *) при взятии адреса &mass_size?

Для чего нужно (char *) при взятии адреса &mass_size?

Нужно записать в бинарный файл число типа int, хранящееся в переменной mass_size

189
Как разбить элемент массива строк на массив из его символов?

Как разбить элемент массива строк на массив из его символов?

Есть массивы a и b типа string, где a[1]="hello"; a[2]="woRlD"; a[3]="qejqjekqew"; Массив b изначально пустой

208