Соответственно выровнять указатель пустоты - PullRequest
0 голосов
/ 29 апреля 2020

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.

1 Ответ

1 голос
/ 30 апреля 2020

Если вы действительно хотите универсальное c решение, возможно, используйте union и, возможно, некоторые макросы препроцессора.

union myptr{
    void *ptr;
    (whatever-type-that-meets-your-padding-requirment) padding;
};

union myptr myalignedptr;
#define alignedptr (myalignedptr.ptr)       /* optional */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...