- 1
- 2
- 3
Fixed f = 0.2;
f = std::abs(f);
std::cout << (float)f;
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+24
Fixed f = 0.2;
f = std::abs(f);
std::cout << (float)f;
Угадайте, чему будет равно f?
Fixed - тип из той же библиотеки, что и в http://govnokod.ru/11294
guest 10.07.2012 14:01 # +1
defecate-plusplus 10.07.2012 14:16 # +12
зрители замерли, завороженно глядя на неравную борьбу маленького героя, несущего свет, с огнедышащим крестоблядским чудовищем из преисподней
кто победит в этом кровопролитном поединке?
что вернет std::abs от исчадия ада?
верно ли, что бесстрашие граничит с безумием?
TarasB 10.07.2012 14:17 # 0
rat4 10.07.2012 14:23 # 0
test.cxx:186:16: error: call of overloaded 'abs(Fixed&)' is ambiguous
TarasB 10.07.2012 14:31 # 0
absolut 10.07.2012 14:38 # +18
rat4 10.07.2012 14:54 # +2
GNU/Linux
TarasB 10.07.2012 15:01 # −1
defecate-plusplus 10.07.2012 15:07 # +6
ты ведь доволен выбором инструмента (окаменелое говно мамонта 2003 года), который из перегрузок abs(integer type) и abs(float type) выбрал не то, что ты хотел?
bormand 10.07.2012 15:24 # +1
И еще и ничего об этом не сказал
defecate-plusplus 10.07.2012 15:31 # +2
от микрософта можно ожидать чего угодно
стандарт то в 2003 году допилили окончательно, наивно полагать, что в 2003 студии (7.1) четкая его поддержка (это же по сути багфикс 2002й .net студии - 7.0)
у меня на работе вообще переход с 6.0 в свое время был сделан сразу на 2005 (8.0), а 7.0/7.1 я видел только в институте
но Тарас лёгких путей не ищет, нашёл левую говнобиблиотеку, взял студию, которая на его селероне хоть как то ворочается, а в итоге виноваты крестобляди
bormand 10.07.2012 15:51 # 0
В 2003 студии, если не ошибаюсь, нельзя писать так:
P.S. Тарас, попробуй закомпилить этот код, пожалуйста, раз уж компилятор под рукой.
TarasB 10.07.2012 15:55 # −1
Кстати, почему нельзя писать так:
if ((int i=SomeFunc())>=0)...
bormand 10.07.2012 16:27 # +1
TarasB 10.07.2012 16:28 # −2
bormand 10.07.2012 16:43 # +1
defecate-plusplus 10.07.2012 16:36 # 0
http://ideone.com/Tmc3n
а в выражении нельзя
bormand 10.07.2012 15:26 # 0
А что он должен был выбрать? Если у него на выбор преобразования во все подряд, и std::abs принимает все подряд... Баг тут в говнокомпиляторе, который молча выбрал первый попавшийся вариант, и промолчал об этом.
http://ideone.com/wnZG3
TarasB 10.07.2012 15:01 # +3
В языке высокого уровня неявные приведения нахуй не нужны!
bormand 10.07.2012 15:44 # +8
TarasB 10.07.2012 15:56 # 0
defecate-plusplus 10.07.2012 16:05 # +4
TarasB 10.07.2012 16:11 # −1
defecate-plusplus 10.07.2012 16:17 # 0
это наследие от C library с дополнениями
TarasB 10.07.2012 16:19 # −1
defecate-plusplus 10.07.2012 16:24 # −1
<stdlib.h>: int abs(int);
<math.h>: double fabs(double);
C++:
<cstdlib> <cmath> - The contents of these headers are the same as the Standard C library headers <math.h> and <stdlib.h> respectively, with the following additions:
* In addition to the int versions of certain math functions in <cstdlib>, C++ adds long overloaded versions of these functions, with the same semantics.
* In addition to the double versions of the math functions in <cmath>, C + + adds float and long double overloaded versions of these functions, with the same semantics.
* The added signatures are: // включил только интересующие нас abs
float abs (float);
float fabs (float);
double abs(double); // fabs()
long double abs (long double);
long double fabs (long double);
bormand 10.07.2012 16:44 # 0
defecate-plusplus 10.07.2012 16:57 # 0
да и ассемблерно вот эти вот все перегрузки (5 штук) явно оптимально могут выполняться отдельно друг от друга
не знаю, чем руководствовался комитет - может, тем, что программист не обломится написать свой шаблонный abs, а может им самим было лень расписывать, что мол имплементация обязана сделать template <class T> T abs(T const &), а затем специфицироваться 5 раз - кстати нюанс, копию или константную ссылку брать
опять же, одно дело max(T const & t1, T const & t2), где объекты сравниваются сами с собой, а другое дело - сравниваются с числом 0, раз сравниваются с числом, значит пусть приводятся к числу самостоятельно
еще как причина - это всё описано в разделе Numerics library - C library, а если шаблон, то який же це це?
bormand 10.07.2012 17:18 # +1
А вот проблема с const & или value и совместимость с С - вполне могли послужить причиной...
TarasB 10.07.2012 17:36 # −1
TarasB 10.07.2012 17:35 # −1
defecate-plusplus 10.07.2012 18:12 # −1
однако, всё равно придется специализации писать, и эти специализации будут использовать const & t, что в общем случае приведет к передаче адреса аргумента, а не копии в регистр/стек - оптимизации в стандарте не описываются, насколько я знаю
так что если господин хочет шаблон - пусть пишет самостоятельно, благо он тривиален
TarasB 10.07.2012 18:56 # −1
Закладываться на то, что const& может не стат значением для целых - тупо. В стандарте Ады-то эта оптимизация есть же...
defecate-plusplus 10.07.2012 21:38 # +2
в общем случае, если компилятор не может заинлайнить какую-то функцию (а это легко может быть - тело функции может лежать в рантайм-либе), он не имеет права передавать int const & как значение через регистр
потому что в теле этой функции ты вдруг захочешь взять указатель аргумента, и тебе должно быть гарантировано получение реального адреса этого объекта
шаблонная функция обычно инлайнится (в той мере, в которой инлайнится другая нешаблонная inline функция)
вот если функция инлайнится, тогда любой нормальный компилятор, конечно, соптимизирует int const & до того, что нужно (обычно, будет пользоваться значением в регистре) - т.е. шаблонный abs(T const &) соптимизируется до передачи int через регистр
но в стандарте этого не написано (я не нашел) и вряд ли будет описано
с современным компилятором можно считать истиной - если программист сказал копию, значит внутри функции он получит нечто, которое будет вести себя как копия (если копия окажется иммутабельной, то оптимизирующий компилятор может передать ссылку на объект с гарантией того же результата), если программист сказал ссылку на объект, значит он получит нечто, ведущее себя как ссылка на объект (если нужен адрес, ты его получишь, если не нужен и не будет никакой разницы с копией - компилятор улучшит)
а что там в аде - то константные ссылки, то копии, - я из твоих объяснений тогда не понял ничего
TarasB 11.07.2012 10:02 # −1
А фигли понимать. Если указатель или целое - то по копии, другое - по указателю.
Для структур размером 4 байта не знаю.
defecate-plusplus 11.07.2012 10:22 # 0
TarasB 11.07.2012 10:37 # −1
defecate-plusplus 11.07.2012 10:42 # +1
TarasB 11.07.2012 10:45 # −2
defecate-plusplus 10.07.2012 21:49 # 0
см 5.19 Constant expressions
Fai 11.07.2012 05:29 # 0
TarasB 11.07.2012 10:03 # +1
Гемор только при работе с сишколибами.
А так зато сразу ясно с каким типом работаем и не надо думать, что к чему приведётся.
Fai 11.07.2012 16:05 # 0
Из-за этого от Си/Си++ долго плевался, но привык. Кодить можно, так сказать.
TarasB 11.07.2012 16:23 # −1
Тогда откуда знаешь, что в Аде геморно?
Fai 11.07.2012 16:33 # 0
Не заценил, а всегда любил...
Имею ввиду что давно уже заценил аду.
TarasB 11.07.2012 17:33 # −1
Fai 11.07.2012 20:56 # 0
GNAT + SciTE.
TarasB 11.07.2012 21:09 # −1
Fai 12.07.2012 08:15 # +5
roman-kashitsyn 12.07.2012 08:50 # +3