g cc (Ubuntu 7.5.0-3ubuntu1 ~ 18.04) 7.5.0
Как выровнять void *
ссылающуюся сущность без объявленного типа с размером строки кэша в способ соответствия?
Мне интересно объяснить легитимность техники общего выравнивания со стандартом.
Моя попытка
void *ptr = //some valid pointer;
void *aligned_ptr = (void *) ((intptr_t) ptr & -64);
Часть (intptr_t) ptr & -64
соответствует поскольку любой 7.20.1.4 N2310
:
целочисленный тип без знака со свойством, что любой действительный указатель на void может быть преобразован в этот тип, затем преобразован обратно в указатель на void, и результат будет сравниваться равным оригинальный указатель
Преобразование (intptr_t) ptr & -64
обратно в void *
не определено, чтобы иметь четко определенное поведение. 6.3.2.3/5
предоставляет некоторую размытую информацию (emp. Mine):
Целое число может быть преобразовано в любой тип указателя. За исключением указанного ранее, результат определяется реализацией , может не быть правильно выровненным , может не указывать на объект, на который ссылаются type , и может быть представлением ловушки .
Если я правильно понимаю концепцию «представления ловушки», то невозможно получить это в таком случае, так как не объявлен тип объекта.
Я не уверен, правильно ли выровнен (void *) ((intptr_t) ptr & -64)
со Стандартной точки зрения, или результат не определен реализацией.
UPD: 6.2.8
Описывает
Каждое действительное значение выравнивания должно быть неотрицательной целой степенью двойки.
Поскольку _Alignof (max_align_t)
равно 16
в моей реализации я полагаю, что выравнивание 64 байтов не обязательно должно поддерживаться g cc.