Практические проблемы с выравниванием C ++: возможное улучшение?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Практические проблемы с выравниванием C ++: возможное улучшение?

Сообщение Anonymous »

Вопрос: понимание и улучшение понятий выравнивания C ++
Определение выравнивания для типа в C ++ несколько низкоуровневая и относительно: оно относится к количеству байтов между последовательными адресами, по которым может быть распределен объект этого типа. байтов между последовательными адресами, по которым можно выделить заданный объект. Более того, это определение является неполным, потому что оно относительно и не имеет «адресации», чтобы сделать ее абсолютным. Кроме того, это не практично (для пользователя), потому что нет способа измерить это расстояние вне массивов, так как арифметика указателя не определена. Преобразование указателей в целые числа также невозможно, поскольку он явно определяется в стандарте (expr.reinterpret.cast): < /p>

Указатель может быть явно преобразован в любой интегральный тип, достаточно большой, чтобы удерживать все значения его типа. Функция отображения определяется внедрением. - End Note]

Практический сценарий, который создает трудности, распределяет объекты в буфере без знака (или std :: byte ). Единственный способ получить правильно выровненного адреса - через std :: align , но нет никаких гарантий, что буфер правильного размера имеет правильный размер для обеспечения такого адреса (см. Связанный вопрос).
Тем не менее, выравнивание имеет решающее значение для реализации оборудования, так как многие посты обсуждают проблемы с производительностью и не определяемые поведение (UB), которые могут привести к неправильной поведении. /> Кажется возможным изменять определение двумя способами: < /p>

Сделать преобразование значения указателя в целочисленное хорошо определенное (не зависимое от реализации), чтобы разница в значениях осталась согласованной с основным реализацией. std :: uintptr_t через reventpret_cast или static_cast ) должен быть кратным выравниванием ». MSVC; Чтобы найти хорошо выдвинутый указатель.

Подробнее здесь: https://stackoverflow.com/questions/796 ... mprovement
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»