@ProCxx

Страница 2385 из 2477
Ilia
28.09.2018
12:26:20
ну а чем еще?
Да хрен знает, UB же....

Pavel
28.09.2018
12:26:46
Google
Ilia
28.09.2018
12:28:12
ну а чем еще?
На практике не должно все же такого быть. Может зацикливаться, может не сортировать. Может выдать диагностику или исключение. Но не падать по выходу за границы массива

Pavel
28.09.2018
12:29:38
ну вот в этом был и вопрос - есть ли такое в стандарте. то что отсоритрует не верно это понятно. но если я в компаратор получаю end + 2 это нормальное следствие плохого компаратора или нет?

в принципе ub = что угодно, но может там есть какие уточнения на это счет

Igor
28.09.2018
12:32:11
в принципе ub = что угодно, но может там есть какие уточнения на это счет
какие уточнения, это же на то и ub, чтобы забить и ничего не уточнять - как звезды сойдутся, так и будет

Constantine
28.09.2018
12:32:52
в итоге окажется что begin/end разных массивов :)

Pavel
28.09.2018
12:34:22
нет, кейс довольно простой - вектор, begin end, размер 8, видно что внутри end указатель как раз на begin + 8.

в итоге окажется что begin/end разных массивов :)
я вот как раз ожидал чего то в этом духе но нет

ээээ там алгоритмически невозможно если вы не end() + 3 в инпут дали
а где посмотреть описание какой конкретно в libc++?

по коду там просто довольно лютая простыня

еще и с рекурсиями

ну если я накосячил где еще было бы хорошо об этом узнать

но прила однопоточная, что она тыкает в рандомную память врайтами маловероятно, магии типа корутин нет

Google
Pavel
28.09.2018
12:37:48
те вроде ничего не должно повлиять было, кроме компаратора

Andrey
28.09.2018
13:17:40
если инсерт вызовет ребалансировку, то e станет указывать чёрттекуда, разве нет?
итераторы (а значит и ссылки на элементы) стандартных ассоциативных контейнеров не протухают при инсерте

Igor
28.09.2018
13:18:29
Alex Фэils?︙
28.09.2018
13:20:00
https://herbsutter.com/2012/05/03/reader-qa-what-about-vc-and-c99/
> The C99 standard is interesting because it was created at a time when a lot of people on the previous committee (C89 — Ed.) went away and did other things. And it was a smaller group that came over who were interested in a special-purpose area, and so it ended up having a lot of things that were not of general-purpose interest. And in fact, when the current revision of C, which is being revised right now, was begun several years ago, one of the questions was "Should we roll back or undo some of the revisions we made in C99?" because the overreaching in C99 was recognized. забавно

Constantine
28.09.2018
13:24:55
а где посмотреть описание какой конкретно в libc++?
да оно везде примерно одинаковое, это полурекурсивный qsort

Pavel
28.09.2018
13:40:44
да оно везде примерно одинаковое, это полурекурсивный qsort
а, я думал вы знаете какое-то конкретно по libc++ описание. может потом попробую разобратся в деталях почему так происходит, интересно.

Ilia
28.09.2018
13:51:10
ээээ там алгоритмически невозможно если вы не end() + 3 в инпут дали
Во, Костя, как ты хорошо это всё сказал, и кратно. А я не смог...

нет, кейс довольно простой - вектор, begin end, размер 8, видно что внутри end указатель как раз на begin + 8.
Так так и должно быть... begin +0 -- начало , begin + 8 -- УМОЗРИТЕЛЬНЫЙ ЭЛЕМЕНТ ЗА КОНЦОМ

еще и с рекурсиями
Там должен быть quick sort

Pavel
28.09.2018
13:53:30
Так так и должно быть... begin +0 -- начало , begin + 8 -- УМОЗРИТЕЛЬНЫЙ ЭЛЕМЕНТ ЗА КОНЦОМ
УМОЗРИТЕЛЬНЫЙ ЭЛЕМЕНТ ЗА КОНЦОМ это тот что в народе end зовется?

Pavel
28.09.2018
13:54:12
Ну да.
ну так и было. я не понял твой поинт.

Ilia
28.09.2018
13:55:23
может. Сталкивался
Ну не верю, хотя пофиг...

Pavel
28.09.2018
13:56:01
может. Сталкивался
о, а ты где такое видел?

Евгений
28.09.2018
13:56:13
Ну не верю, хотя пофиг...
Ну и зря. Противоречивый компаратор провоцировал падение процесса.

Pavel
28.09.2018
13:57:50
на работке.
хм, nuff said. ну я имел ввиду - osx, linux/llvm gcc?

Евгений
28.09.2018
13:57:50
Если загуглить "stl comparator segfault" первая же ссыль на стековерфлоу ведет

Google
Евгений
28.09.2018
13:58:01
Pavel
28.09.2018
13:58:19
Ilia
28.09.2018
13:58:51
Ну и зря. Противоречивый компаратор провоцировал падение процесса.
Из-за выхода за границы сортируемого массива?

Евгений
28.09.2018
13:59:28
Из-за выхода за границы сортируемого массива?
Хз от чего. Сам компаратор был противоречивым, но сам по себе не генерил segfault-ов

Ну , STL и comparator мало, надо ещё и sort...
достаточно. первая ссылка по предложенному мной запросу как раз про sort

Ilia
28.09.2018
14:01:14
Почитаю...

Pavel
28.09.2018
14:03:46
Если загуглить "stl comparator segfault" первая же ссыль на стековерфлоу ведет
да, посмотрел. интересно. у меня на линуксе как раз работает, а на маке нет. но это уже детали. там по ссылке у него в итераторе сработал ассерт из дебаг мода libstdc++, если я правильно понял.

Ilia
28.09.2018
14:04:33
достаточно. первая ссылка по предложенному мной запросу как раз про sort
Ну, это не падение, это выдача диагностики, я такое допускал выше. /usr/local/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../../include/c++/4.1.2/debug/safe_iterator.h:240: error: attempt to decrement a dereferenceable (start-of-sequence) iterator. Objects involved in the operation: iterator "this" @ 0x0xbf4b0844 { type = N11__gnu_debug14_Safe_iteratorIN9__gnu_cxx17__normal_iteratorIPPN15__gnu_debug_def6vectorIiSaIiEEEN10__gnu_norm6vectorIS7_SaIS7_EEEEENS4_IS7_SB_EEEE (mutable iterator); state = dereferenceable (start-of-sequence); references sequence with type `N15__gnu_debug_def6vectorIPNS0_IiSaIiEEESaIS3_EEE' @ 0x0xbf4b0844 }

Это отладочная версия C++ RL, и она делает определённые проверки в процессе сортировки, и при ошибках этих проверок выдаёт соотв. диагностику.
В релизной сборке оно бы это НЕ выдавало и либо зациклилось, либо не отсортировалось (НО ЭТО НЕ ТОЧНО ! :-) )

Евгений
28.09.2018
14:07:42
В релизной сборке оно бы это НЕ выдавало и либо зациклилось, либо не отсортировалось (НО ЭТО НЕ ТОЧНО ! :-) )
сам понимаешь, зависит от того, где по памяти лежит контейнер, вызховется ли защита памяти

там оптимизации, сдвиг итератора на определенное кол-во позиций влево-вправо без проверок

за границы выйти может - это точно. А вот упадет или нет - это уже да, вопрос

Ilia
28.09.2018
14:09:02
сам понимаешь, зависит от того, где по памяти лежит контейнер, вызховется ли защита памяти
Евгений, в том-то и дело, что для алгоритма сортировки этот массив должен изначально быть ограничен этими рамками [begin,end) и он НЕ ДОЛЖЕН ни при каких обстоятельствах за них выходить.

там оптимизации, сдвиг итератора на определенное кол-во позиций влево-вправо без проверок
Оно по-любому не должно никуда выходить за границы, не смотря на то, куда там будет сдвиг, и какой...

Ну, вы конечно можете оставаться со своим мнением...

Евгений
28.09.2018
14:10:57
Ilia
28.09.2018
14:11:47
Google
Pavel
28.09.2018
14:11:57
В релизной сборке оно бы это НЕ выдавало и либо зациклилось, либо не отсортировалось (НО ЭТО НЕ ТОЧНО ! :-) )
error: attempt to decrement a dereferenceable (start-of-sequence) - я могу ошибаться но кажется это libstdc++ сообщает что кто-то пытается --begin сделать. если он дальше его сунет в компаратор то то и получится. те оно тут как бы уже вышло за границы

Евгений
28.09.2018
14:11:59
Ну, значит, что-то не так делал...
да, я передавал противоречивый компаратор

Ilia
28.09.2018
14:12:22
Евгений
28.09.2018
14:13:02
нет, ПОМИМО ЭТОГО
нет:D что можно сделать не так в коде, заполняющем контейнер, и делающем sort с компаратором?)

Timur
28.09.2018
14:16:42
а в какой версии компилятора vs?
ну я как-то пропустил точный момент, но вроде это было еще во времена VS2013 https://www.infoq.com/news/2013/07/vs2013_CPP_compliance

Евгений
28.09.2018
14:20:08
А в чем вопрос?
Инлайн пробовал, я его убрал на время перед скриншотом. Вопрос: почему так медленно вызывается функция или Что я делаю не так?

Ruslan
28.09.2018
14:22:19
Инлайн для того и придуман, чтобы замещать вызов тупым копированием пары строк кода

Евгений
28.09.2018
14:23:33
Всё так же

Ruslan
28.09.2018
14:24:32
Ну, во-первых, инлайн не даёт гарантию инлайнинга

Это рекомендация компилятору скорее

Во-вторых, хотелось бы увидеть код и результаты

Igor
28.09.2018
14:25:30
+ жирная ремарка линкеру "если увидишь N реализаций этой функции одновременно - не выдавай ошибку, оставь из N только 1 и ей пользуйся"

Евгений
28.09.2018
14:28:31
Это рекомендация компилятору скорее
а как заставить его заинлайнить? Потому что я прям на 1000% уверен что он инлайн сам убрал

Ruslan
28.09.2018
14:29:05
зависит от компайлера наверное

Евгений
28.09.2018
14:30:05
Google
Pavel
28.09.2018
14:30:39
перед функцией надо написать

Евгений
28.09.2018
14:31:54
[[gnu::always_inline]] работает в гцц
окей, сап. Ещё вопрос: у меня интел проц, компилирую интел компилятором, а производительность меньше (тоже на скриншоте показал). В чём прикол? Написать разрабам тикет на это?

Евгений
28.09.2018
14:32:39
Ilia
28.09.2018
14:32:46
Я же сказал, что инлайн пробовал
Ты не знаешь, что такое inline..

Pavel
28.09.2018
14:33:10
Задать неверно диапазон для сортировки
за Евгения не скажу, но свой я проверил, у меня правильный. прям в отладчике смотрел.

Ruslan
28.09.2018
14:33:26
А если по топику, то у интело компайлера мильен флагов для тюнинга

Ruslan
28.09.2018
14:38:57
С кода следует начинать 99% обсуждений

Pavel
28.09.2018
14:38:59
Дай код тогда.. .
сие не могу, кусок будет сложно выцепить. извиняй, клоузд сорс.

Evgeniy
28.09.2018
14:39:15
Напиши, обязательно!
можно еще в спортлото

Ruslan
28.09.2018
14:39:42
сие не могу, кусок будет сложно выцепить. извиняй, клоузд сорс.
В таких случаях клепают минимально воспроизводимый пример на пасте и шарят

Страница 2385 из 2477