|
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
|
|||||||||||||||||||||||||||||||
Strict aliasing вынуждает писать неэффективный код19.10.2025, 06:21. Показов 3719. Ответов 4
Всем привет.
Есть шаблон функции, логику которой нужно перенести в файл.cpp
В данном примере ожидается последовательность 32 битных чисел. Тип числа можно быть, например std::uint32_t, или например wchar_t (на линукс платформах) Или char32_t, в общем - любой числовой 32х битный тип. Что бы перенести логику в файл.cpp, нужно сделать обычную (нешаблонную) функцию, способную принимать указатели разных типов. Первое, что приходит в голову: передача void*, с последующей реинтерпретацией типа указателя:
Но у него есть один фатальный недостаток: код содержит UB Что бы устранить UB, нужно использовать что-то вроде std::bit_cast Но тогда начинает страдать читабельность, а так же эффективность:
Читабельность ещё можно более менее сохранить за счет вспомогательных инструментов. Например
Однако с эффективностью беда: memcpy на каждой итерации. А если надо будет изменить значение элемента, тогда нужно будет делать ещё одно memcpy. Можно попробовать выкрутиться за счет type erasure, но в таком варианте эффективность так же пострадает, из-за использования полиморфизма. type erasure
Для новых компиляторов можно выкрутиться за счет std::launder, а лучше сразу std::start_lifetime_as Потому что у std::launder тоже есть какие то проблемы. И, кстати, я так и не поняла, с чем связанно UB ?
Итого, у меня 3 вопроса: 1) С чем связанно UB в примере использования std::launder? 2) Как грамотно решить задачу для старых компиляторов (c++98) ? 3) Как грамотно решить задачу для новых компиляторов? Приведите, пожалуйста, код решения.
0
|
|||||||||||||||||||||||||||||||
| 19.10.2025, 06:21 | |
|
Ответы с готовыми решениями:
4
Union, new placement, strict-aliasing, cross-platform Каламбур типизации и strict aliasing Strict aliasing и memcpy |
|
фрилансер
6450 / 5651 / 1129
Регистрация: 11.10.2019
Сообщений: 15,046
|
||
| 19.10.2025, 09:05 | ||
|
https://godbolt.org/z/rjenPs9dY std::memcpy(&val, bit32, sizeof(u32_t)); mov rax, QWORD PTR [rbp-24]---------- А насчёт void*. Я почему-то считал, что это тоже исключение для strict aliasing ![]() Ведь и функции есть, которые его принимают - qsort, memcpy и так далее
2
|
||
|
97 / 73 / 27
Регистрация: 30.03.2023
Сообщений: 201
|
|||||||
| 20.10.2025, 13:55 | |||||||
|
Насколько я понимаю, решается это вопрос примерно так:
А вот на полученное тобой p:
0
|
|||||||
| 21.10.2025, 01:22 | |||
|
0
|
|||
|
Вездепух
12932 / 6800 / 1820
Регистрация: 18.10.2014
Сообщений: 17,211
|
||||
| 21.10.2025, 09:30 | ||||
char является исключением. А через какой промежуточный тип указателя это сделано - не имеет значения.char. А то, что указатель на входе был void * ни на что здесь не влияет.Добавлено через 6 минут void *. Это делается из старых как мир соображений: сокрытие реализации и избежание разбухания кода.Во-вторых, все назначение темплейтных примитивов, выполняющих type erasure (например, std::function<>), как раз и сводится к тому, чтобы "написать темплейт", который "вберет в себя" всю темплейтность и тем самым позволит нам устранить (или уменьшить) темплейтность окружающего кода. Для достижения тех же целей: сокрытие реализации и избежание разбухания кода.
1
|
||||
| 21.10.2025, 09:30 | |
|
Помогаю со студенческими работами здесь
5
dereferencing type-punned pointer will break strict-aliasing rules strict aliasing and custom structure strict c++ : 64 bit int Не могу дальше писать программу из-за того что не могу, не умею писать БД Помогите писать на С++ через шаблоны. Консуле я писал, но надо писать исползуя шаблоны Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
|
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма).
На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам
Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|