
Alexander
07.09.2018
10:54:15
если тебе именно как кодец выглядит не нравится

Евгений
07.09.2018
10:54:45

Alexander
07.09.2018
10:56:09
А почему бы и да?

Евгений
07.09.2018
10:58:54
А почему бы и да?
LOG_ADD_IF( detailedLog ) << L"Найдено " << contragents.Size() << L" закрепленных контрагентов";
вот как все такие кейсы учесть?

Google


Matthew
07.09.2018
11:18:15
Всем привет! Нетиповый, может быть, вопрос для этого чата, но что есть.
Делаю "бенчмарк" (просто много однотипных операций с разными типами, условия лабки, чего поделать) в C++. Компилирую g++ с -O1. Гоняю под Linux 64 bit.
В моменте с действиями над float и double есть "просто деление на i", "просто умножение на i" и "деление, а потом умножение на i". Соответственно, в первом варианте получается inf (по идее) в результате, во втором 0, а в третьем начальное число.
Теперь проблема: в случае компиляции с m64 всё более-менее предсказуемо ("деление + умножение" ~~ "просто деление" + "просто умножение" по времени, ну чуть дольше). В варианте же с m32 получаю внезапно катастрофу в случае умножения (т.е. там где будет inf).
Добавляю скрины вывода:
UPD скрины не могу, сейчас вставлю текст
https://1drv.ms/f/s!Ai564hcpa7h8iKxl3laMzhs8wI7A4A - там скрины
Кто-то знает, почему такой резкий просад? Может ли быть косяк в реализации действий с inf при запуске 32-битного приложения под 64-битной системой?


Antony
07.09.2018
11:25:26
Компилятор не будет оптимизировать "деление, а потом умножение на i" в "начальное число" без -ffast-math
И лучше бенчмаркать на -O2
Вот тут можно смотреть, во что компилятор превращает код: https://godbolt.org/ (идеальная штука, для отчётов по лабам )

Matthew
07.09.2018
11:27:17

Antony
07.09.2018
11:27:48
Можете код скинуть, а то я текстовое описание плохо понимаю :(

Alexander
07.09.2018
11:27:51

Matthew
07.09.2018
11:30:10

Antony
07.09.2018
11:45:31

Matthew
07.09.2018
11:58:59

Pavel
07.09.2018
12:07:14
Есть вопрос, существует ли механизм отмотки стека, на подобии того что используется в setjmp
(возможно что-то подобное используется в бустовых корутинах)?

Даня
07.09.2018
12:07:36
Ребят, привет.

Google

Antony
07.09.2018
12:09:35

Ilia
07.09.2018
12:10:05

Pavel
07.09.2018
12:10:14

Ilia
07.09.2018
12:11:10
А чем не нравится?

Pavel
07.09.2018
12:14:42

Antony
07.09.2018
12:16:01
О_О
А санитайзер не ругается на приложение?

Ilia
07.09.2018
12:22:01

Pavel
07.09.2018
12:22:46

Ilia
07.09.2018
12:23:34
А сам Oz это что?

Pavel
07.09.2018
12:23:42
оптимизация размера
Но там не только в ней проблема, в целом у андройда exception криво притянут за уши

Ilia
07.09.2018
12:24:46

Pavel
07.09.2018
12:24:57
> оптимизация размера
> андроид

Pavel
07.09.2018
12:26:34

Ilia
07.09.2018
12:27:26
Ты просто более генерально заходишь...

nuClide
07.09.2018
13:08:57
Привет, можете подсказать причины, из-за которых последняя строчка может приводить к крашу?
ATargetMissle* Missle = world->SpawnActor<ATargetMissle>(MissleToSpawn,GetActorLocation(),rotator,spawnParams);
if(Missle)
{
Missle->Target = NearestObject;
}

Евгений
07.09.2018
13:11:09
а уверены, что в случае "НЕУСПЕХА" вызова world->SpawnActor<ATargetMissle> вы возвращаете nullptr?

nuClide
07.09.2018
13:12:56
Эта строчка работает нормально и всегда создаёт объект, в краше указывает на ошибку доступа к памяти

Google

Евгений
07.09.2018
13:17:18
он может лежать там, если SpawnActor вернул мусор

nuClide
07.09.2018
13:21:00

Kitsu
07.09.2018
13:47:20

nuClide
07.09.2018
13:50:19
Target это публичная переменная типа ссылки на объект, наследующий AActor

Igor
07.09.2018
13:53:34
AActor& Target;?
если так, то попытка ->Target = NearestObject приведёт к тому, что существующий объект, на который сейчас указывает таргет, попытается переинициализироваться значениями из NearestObject, вместо того чтобы таргет начал указывать на NearestObject

Евгений
07.09.2018
13:57:21
Есть стойкое ощущение, что в Missle мусор. внутри SpawnActor какой нибудь:
Pointer *prt;
....
return ptr;
и на отладочке там красивый nullptr, а в релизе ад какой-нибудь

Ilia
07.09.2018
14:21:59

Dmitry
07.09.2018
16:22:32
Всем привет! Кто-нибудь знает почему у std::merge в компаратор сначала передаётся *iter2, а потом *iter1 ?
см. возможную реализацию
https://en.cppreference.com/w/cpp/algorithm/merge

Евгений
07.09.2018
16:25:39


Dmitry
07.09.2018
16:26:22
4465 template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
4466 _OutputIterator
4467 __merge(_InputIterator1 __first1, _InputIterator1 __last1,
4468 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
4469 {
4470 for (; __first1 != __last1; ++__result)
4471 {
4472 if (__first2 == __last2)
4473 return _VSTD::copy(__first1, __last1, __result);
4474 if (__comp(*__first2, *__first1))
4475 {
4476 *__result = *__first2;
4477 ++__first2;
4478 }
4479 else
4480 {
4481 *__result = *__first1;
4482 ++__first1;
4483 }
4484 }
4485 return _VSTD::copy(__first2, __last2, __result);
4486 }
4474 строчка
почему не обратный порядок аргументов


Aleksandr
07.09.2018
16:27:09
при этом на cppreference про компаратор написано:
The signature of the comparison function should be equivalent to the following:
bool cmp(const Type1 &a, const Type2 &b);
The types Type1 and Type2 must be such that objects of types InputIt1 and InputIt2 can be dereferenced and then implicitly converted to both Type1 and Type2


Евгений
07.09.2018
16:28:00
4465 template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
4466 _OutputIterator
4467 __merge(_InputIterator1 __first1, _InputIterator1 __last1,
4468 _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
4469 {
4470 for (; __first1 != __last1; ++__result)
4471 {
4472 if (__first2 == __last2)
4473 return _VSTD::copy(__first1, __last1, __result);
4474 if (__comp(*__first2, *__first1))
4475 {
4476 *__result = *__first2;
4477 ++__first2;
4478 }
4479 else
4480 {
4481 *__result = *__first1;
4482 ++__first1;
4483 }
4484 }
4485 return _VSTD::copy(__first2, __last2, __result);
4486 }
4474 строчка
почему не обратный порядок аргументов
Наверно по алгоритму там надо ("больше либо равно"), а компаратор работает как "строго меньше"

Aleksandr
07.09.2018
16:28:55
ну сделали бы !comp(...)
вопрос в том, почему на cppreference сигнатура одна, а на деле ожидается другая

Евгений
07.09.2018
16:29:43

Aleksandr
07.09.2018
16:31:13
ну, !(меньше) это тоже самое что (больше или равно)

Евгений
07.09.2018
16:31:32
А, туплю
Так на такт менее эффективно)

Google

Sergey
07.09.2018
16:34:21
Нет, так нарушается порядок
For equivalent elements in the original two ranges, the elements from the first range (preserving their original order) precede the elements from the second range (preserving their original order).

Евгений
07.09.2018
16:36:46

Aleksandr
07.09.2018
16:37:25
вот, цитата с cppreference:
the signature of the comparison function should be equivalent to the following:
bool cmp(const Type1 &a, const Type2 &b);
The types Type1 and Type2 must be such that objects of types InputIt1 and InputIt2 can be dereferenced and then implicitly converted to both Type1 and Type2.
первым идёт тип InputIt1, вторым InputIt2