В чем разница между «минимальным выравниванием» и «предпочтительным выравниванием»? - PullRequest
3 голосов
/ 06 января 2020

Недавно я заметил, что в Clang 9.0 alignof и __ alignof возвращают разные значения для unsigned long long , и то же самое обсуждалось в https://reviews.llvm.org/D54814:

Начиная с Clang 8.0 и G CC 8.0, alignof и __alignof возвращают разные значения в одинаковых случаях. В частности, alignof и _Alignof возвращают минимальное выравнивание для типа, где __alignof возвращает предпочтительное выравнивание.

Я знаю о выравнивании типов, но никогда не сталкивался с "минимальным выравниванием" и " предпочтительное выравнивание ".

Может ли кто-нибудь помочь мне понять, что именно это и в чем разница? Спасибо.

1 Ответ

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

Минимальное выравнивание (на данной платформе) такое, которое не дает сбоев. На x86-64 это один байт. На PowerP C или Spar c или RIS C -V это, вероятно, 4 или 8 байтов.

предпочтительным выравниванием является то, которое обычно, например, из-за шины процессора или кэшей процессора. На x86-64 для unsigned long long это, вероятно, 8 байт. Любой менее выровненный доступ имеет снижение производительности.

Подробности относятся к целевому процессору и ABI специфицирует c (например, см. this ). Подумайте о кросс-компиляторах .

Семантика из C или C ++ не является полностью определенной и не полностью формализованной. Посмотрите на проект C ++ стандарта : он написан на английском языке sh, не формализован. Но смотрите также Frama- C (он имеет экспериментальный интерфейс для C ++) и CompCert . Читайте о неопределенное поведение .

...