
Artem
25.11.2016
20:38:46
он может и 17 возвращать

Dumitru
25.11.2016
20:39:02

John
25.11.2016
20:39:03
ну так вопрос же в этом...

Artem
25.11.2016
20:39:08
может

Google

Dumitru
25.11.2016
20:39:15

John
25.11.2016
20:39:16

Artem
25.11.2016
20:39:24
потому что ничего не запрещает ему так делать

fox.cpp
25.11.2016
20:39:37
да?

Vladislav
25.11.2016
20:39:41

Artem
25.11.2016
20:39:53
как только мы вступаем на скользкую дорожку ub

babysitter
25.11.2016
20:40:50
у меня вообще стек разломалсо

Stanislav
25.11.2016
20:41:04
в debug?
и дебаг и релиз, студия 2015 отдает 0

John
25.11.2016
20:41:06

Vladislav
25.11.2016
20:41:49
а, уже почитал, в msvc они не делают эту оптимизацию)

fox.cpp
25.11.2016
20:42:21

Vladislav
25.11.2016
20:42:27
потому что часть winapi с ней сломается :D

Google

Vladislav
25.11.2016
20:42:32

fox.cpp
25.11.2016
20:42:35
(

Vladislav
25.11.2016
20:43:37
На одной и той же платформе все типы будут с одинаковым endianness

John
25.11.2016
20:44:41
а на ideone как оно там компилится?

Stanislav
25.11.2016
20:45:53
-fno-strict-aliasing

babysitter
25.11.2016
20:46:34
кланг специфик похоже

Stanislav
25.11.2016
20:47:40
гцц так то

Vladislav
25.11.2016
20:47:50
нужен spoiler bot)

fox.cpp
25.11.2016
20:48:15
сдаюсь, кто объяснит мне почему так происходит?

Artem
25.11.2016
20:51:36
int и long разные типы, и компилятор считает, что int* и long* не могут указывать на одно и то же место в памяти, и оптимизирует исходя из этого.
Это называется strict aliasing. А ключ -fno-strict-aliasing его отключает.

fox.cpp
25.11.2016
20:53:56
эгхм.. в чём же тогда заключается эта оптимизация?

Tony
25.11.2016
20:56:13
клевая задача
сам бы не догадался, наверное

Artem
25.11.2016
21:03:31
оптимизация? ну он видит, что возвращается то, что положили по *x (константа 1), и не видит возможностей для его изменения. Поэтому вместо того, чтобы лишний раз доступаться по указателю, он возвращает константу

babysitter
25.11.2016
21:08:51
думаю что-то такое должно решить проблему
int f(volatile int* x, long* y)
нет, на кланге не решило

Stanislav
25.11.2016
21:13:32
по стандарту только const volatile

Google

Alex Фэils?︙
25.11.2016
21:13:40
http://ideone.com/erDo29

Stanislav
25.11.2016
21:14:33

Alex Фэils?︙
25.11.2016
21:17:11
?????

fox.cpp
25.11.2016
21:17:59

Alex Фэils?︙
25.11.2016
21:18:24

Vladislav
25.11.2016
21:24:10

fox.cpp
25.11.2016
21:24:24

Vladislav
25.11.2016
21:24:50
И компилятору так кажется)

Alex Фэils?︙
26.11.2016
04:12:38
Это лажовая идея от слова совсем
Но я все равно, так и не понял, как избавиться от сырых указателей в том случае

Vladislav
26.11.2016
04:16:10
так, может? http://ideone.com/sLTRGV

Alex Фэils?︙
26.11.2016
04:17:26
А. Да
Я тогда ступил с operator new в конструкторе ptr'а
Надо make_*<T>([T_ctor_params])

Vladislav
26.11.2016
04:37:21
да, и перемещать vector вместо копии

Михаил
26.11.2016
08:52:24
Кто может подсказать, куда пропадает 4 элемент: http://pastebin.com/Jbh1j5R2 Собираю в VS2010. Компилятор делает интересный финт ушами, он создает новый ObjectPoi(ObjectJump &j), так как не находит другого способа передать ObjectJump в ObjectPoi, и, заменяет 4 на 7. Не понятно как он это делает. Видно, что не через ObjectPoi(ObjectPoi &j). В итоге 7 объект удаляется два раза, а 4 ни одного.

Vladislav
26.11.2016
08:56:06
не "интересный финт ушами", а implicit conversion

Михаил
26.11.2016
09:02:53
Не похоже это на неявное преобразование типов.
VS2012 ведет себя аналогично.

Google

Михаил
26.11.2016
09:05:04
Как запретить это преобразование? Он по сути делает memcpy() одного объекта в другой. В результате два объекта с 7 номером.

Vladislav
26.11.2016
09:05:47
пометь конструтор как explicit

Михаил
26.11.2016
09:15:20
Если пометить, то при компиляции вылезает ошибка в ObjectPoi(ObjectJump &j). А тут все правильно работает. Проблема дальше, в создании нового ObjectPoi и замене им старого через memcpy(). Это действие надо запретить.

babysitter
26.11.2016
09:16:11
это не должно компилиться нигде, не знаю как это вообще работает

Admin
ERROR: S client not available

Vladislav
26.11.2016
09:16:57
вообще да, приличные компиляторы говорят вот так: https://ideone.com/OU62Ko

Михаил
26.11.2016
09:18:05
Да, в гцц не компилится. Хочу понять, что в VS не так и пойти исправлять код для гцц.

babysitter
26.11.2016
09:19:19
я специально решил глянуть, что студия скажет, чисто для того чтобы убедиться. неявное преобразование она разрешает, но p = obj.New(); — это ж вызов operator=(), которого нет

Дед Пегас
26.11.2016
09:19:30

Vladislav
26.11.2016
09:19:33
в VS, вероятно, нетривиальный UB из-за кривого компилятора
из-за этого такое поведение - id тупо копируется

babysitter
26.11.2016
09:20:25
2010 что тут скажешь

Vladislav
26.11.2016
09:20:47
MS никогда не умела в компиляторы
у меня до сих пор ночные кошмары от VS6 :)

Михаил
26.11.2016
09:22:17
Как этот код теперь под гцц собрать?

Vladislav
26.11.2016
09:33:54
расставить const в нужных местах, для начала

7thSense
26.11.2016
10:02:28
Помогите написать функцию для листа: необходима функция, которая выполняет такую строчку
l1 = l2.reverse();
Где функция reverse - разворачивает лист

Google

7thSense
26.11.2016
10:03:12
Важно, что l2 изменяться не должен

babysitter
26.11.2016
10:03:48
std::transform + std::reverse?

7thSense
26.11.2016
10:04:13
Библиотеками пользоваться нельзя(
Ну просто скажите суть: как вернуть в новый лист, измененный исходный
При условии, что исходный меняться не должен

babysitter
26.11.2016
10:05:39
создаешь новый лист, проходишься по первому в обратном порядке, копируешь элементы в новый, возвращаешь, профит

fox.cpp
26.11.2016
10:05:48

7thSense
26.11.2016
10:06:31
list *tmp = new list;
Так?
И возвращать указатель?

fox.cpp
26.11.2016
10:06:56
по значению вернуть уже не в моде?

7thSense
26.11.2016
10:07:27
А там когда в функции создаешь, область видимости листа остается в функции, не?

fox.cpp
26.11.2016
10:07:47
ну дк... он скопируется в область вне функции.
по идее

7thSense
26.11.2016
10:08:18
Я так пробовал, он возвращает на пустую область

babysitter
26.11.2016
10:08:24
в худшем случае — это копирование, а так это nrvo