Члены struct
дополнены, чтобы выполнить требование выравнивания, когда реорганизация членов, чтобы выполнить это требование сохраняет память
Это средство проверки отмечает struct
возразите, где расположение его членов требует дополнительного дополнения, чтобы выполнить требование выравнивания. Реорганизация членов такого struct
объектная сила выполняет требование выравнивания, не требуя никакого дополнительного дополнения. Поскольку дополнение является ненужным в целях выравнивания, устранение дополнения сохраняет память. Рассмотрите этот struct
в системе на 64 бита:
struct A { uint32_t m1;// 4 bytes uint64_t m2;// 8 bytes uint32_t m3;// 4 bytes };
m1
и m2
помещаются последовательно, машина требует, чтобы два цикла считали m2
. Вместо этого переменная m1
помещается в 8-байтовый паз отдельно после дополнения его на 4 байта. Затем m2
помещается в его собственный 8-байтовый паз. Переменная m3
также дополнен, чтобы выполнить требование выравнивания для struct A
. Из-за дополнения, размера A
24 байта даже при том, что объединенный размер m1
, m2
, и m3
16.Polyspace® повышения этот дефект, когда требование выравнивания может быть выполнено путем реорганизации членов struct
. Например, перестраивая члены A
может устранить дополнение:
struct A { uint64_t m2;// 8 bytes uint32_t m1;// 4 bytes uint32_t m3;// 4 bytes };
m2
занимает первое место в 8-байтовом пазе. Затем m1
и m3
помещаются вместе в другом 8-байтовом пазе. Эта перестановка устраняет дополнение.Ненужное дополнение тратит впустую память, которая может иметь несколько неблагоприятных ударов:
Используя большую память, чем необходимая сила исчерпывают доступную память, приводящую к отказу разбивки на страницы.
Функционирует, такие как memcpy
и memcmp
может занять больше времени.
Чтобы зафиксировать этот дефект, перестройте члены struct
устранить ненужное дополнение. Объявите самый большой struct
члены сначала, и затем сохраняют объявления того же самого - измеренные члены вместе. Вы можете также использовать pragma
директивы, чтобы устранить дополнение.
Повышения производительности могут варьироваться на основе компилятора, реализации библиотеки и среды, которую вы используете.
Группа: Производительность |
Язык: C | C++ |
Значение по умолчанию: Off |
Синтаксис командной строки:
UNNECESSARY_STRUCT_PADDING |
Удар: Средняя |