225 / 52 / 4
Регистрация: 22.07.2018
Сообщений: 249
|
|
1 | |
Зачем нужен std::launder?22.07.2018, 13:26. Просмотров 4148. Ответов 17
Метки нет Все метки)
(
0
|
|
22.07.2018, 13:26 | |
Зачем нужен std::map
Зачем часто писать std::, если можно один раз using namespace std?
|
|
Don't worry, be happy
|
||||||
22.07.2018, 13:48 | 2 | |||||
0
|
Заблокирован
|
|
22.07.2018, 13:52 | 3 |
0
|
Don't worry, be happy
|
|
22.07.2018, 14:06 | 4 |
0
|
748 / 351 / 72
Регистрация: 10.06.2014
Сообщений: 2,368
|
|
22.07.2018, 14:08 | 5 |
_stanislav,
Дело не в том что рабочий указатель или нет. Компилятор видит что Some::x на который указывает p является константой. Теперь если компилятор "встретит" вызов Some::x от имени указателя p, то он имеет полное право не обращаться по данному адресу а просто подставить число которое мы присвоили const int x при создании объекта потому это что константа которая по идее не может быть изменена. А то что далее следует placement new - компилятору скорее всего чихать. Поэтому мы не можем полагаться на то что из p->x будет получено новое значение, присвоенное при помощи placement new. А вот если использовать std::launder, тогда чтение p->x уже будет происходить из памяти, и можно будет прочитать новое значение.
3
|
Заблокирован
|
|
22.07.2018, 15:42 | 6 |
0
|
748 / 351 / 72
Регистрация: 10.06.2014
Сообщений: 2,368
|
|
22.07.2018, 16:25 | 7 |
_stanislav,
Почему не правильно? Можно конкретнее и с причинами? ![]()
0
|
|
22.07.2018, 16:34
#8
|
Не по теме: Undisputed, забей, мысли в слух, лень демагогию разводить
0
|
lArtl
|
22.07.2018, 20:07
#9
|
0
|
Don't worry, be happy
|
||||||
23.07.2018, 09:34 | 10 | |||||
Приведу тогда более наглядный пример:
2
|
Заблокирован
|
|
23.07.2018, 12:08 | 11 |
Croessmah, чёта студия 17 в х86 режиме launder не видит, что за ..., в х64 видит.
0
|
Заблокирован
|
|
23.07.2018, 12:17 | 12 |
0
|
Форумчанин
![]() ![]() 8161 / 5009 / 1436
Регистрация: 29.11.2010
Сообщений: 13,455
|
|
23.07.2018, 12:29 | 13 |
Это очень специфическая вещь. Есть подозрение, что нужен он скорее разработчикам компиляторов.
Связан он с placement new и оптимизациями компилятора для констант. Если в вашем коде возникла необходимость в std::launder, то скорее надо код переписать, чем внедрять эту функцию. Вот здесь есть парочка примером как он работает и как не надо делать в prod коде. https://en.cppreference.com/w/cpp/utility/launder
1
|
Заблокирован
|
|
23.07.2018, 12:46 | 14 |
как я понял, просто читает данные непосредственно из памяти вне всяких оптимизаций?
0
|
284 / 175 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
|
23.07.2018, 16:04 | 15 |
И что он должен демонстрировать?
Нарушение string aliasing это UB и std::launder это не отменяет. Добавлено через 2 минуты Даже вывод Код
20 20 20
0
|
Заблокирован
|
|
23.07.2018, 16:42 | 16 |
0
|
![]() ![]() |
|
15.01.2019, 20:05 | 17 |
Только вот я не уверен, что тест корректный. В процедуре bar было нарушение strict-aliasing'а. Но хз, позволяет ли такое нарушение делать std::launder
Добавлено через 3 часа 18 минут В примере из поста #10 имеем следующее. Вызов функции bar приводит к нарушению strict aliasing'а. В режиме с оптимизациями на некотором наборе компиляторов это приведёт к ошибке исполнения, т.к. отработает оптимизация с условным названием "strict aliasing", которая будет считать, что записи по указателю типа int32_t не могут модифицировать переменную типа int64_t. Использование std::launder, упрощённо говоря, отменяет данную оптимизацию конкретно в строке 18 и как последствие тест как бы заработает. Но при этом он по прежнему остаётся некорректным, хотя в какой-то мере демонстрирует принцип работы std::launder Если я правильно понял всю эту наноконцепцию. Упрощённо говоря, std::launder рожает "новый указатель", значение которого равно "старому указателю" (т.е. аргументу std::launder). Но при этом внутри компилятора новый указатель теряет все вычисленные оптимизатором свойства старого указателя. Т.е. является как бы барьером для некоторых оптимизаций/анализов компилятора. Получается, что std::launder является борьбой языка Си++ с собственными же концепциями Да нет, разработчики компилятора точно не при чём. Я бы сказал так, что функциональность std::launder - это то, что понятно для разработчиков компилятора и не понятно для большого количества нормальных людей Вот тут соглашусь
2
|
Don't worry, be happy
|
|
15.01.2019, 22:13 | 18 |
0
|
15.01.2019, 22:13 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь. Зачем указывать using namespace std Зачем в команды ввода/вывода добавляют std:: Зачем std::set имеет в наличии не константный итератор? Std::ios::binary зачем нужно это для записи структур Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |