Это копия, сохраненная 7 августа 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Жаваблядям - капут
Питонисты рыдают
И дотнет не спасут
Тьма нахлынет за тьмою
Из восставших степей
Морем мора накроет
Стадо жирных свиней
Их телами украсит
Все столбы фонарей
Кровью лиспер окрасит
Их отравленный Рейн
Вопреки Откровенью
Вряд ли выживет треть
Языкам их - забвенье
И их паттернам - смерть
На потеху сиблядям
Их прогресса плоды
Нет того, что могло бы
Спорить с мощью орды
Старший брат: >>776344 (OP)
Предыдущий: >>780630 (OP)
TL;DR
Q: Я хочу тотчас вкатиться, а разбираться буду в процессе. Что я должен делать?
Q: Не уверен, что хочу изучать C++. Как мне пощупать его без лишней ебли?
A: Читаешь эту книжку, смотришь упражнения из нее и суешь в онлайн-компилятор. Сообщения компилятора об ошибках копипастишь в гугл, ответы на возникающие у тебя вопросы ищешь в предыдущих тредах, спрашиваешь в этом треде, если не нашел. Если тебя послали на хуй или не ответили, то ты спросил платину, читай предыдущие треды внимательнее.
Памятка ньюфагу
- Вопросы по синтаксису идут на хуй
- Лабы идут на хуй
- "Как мне сделать Х на чистых крестах без библиотек" идут на хуй
- Все идут на хуй
- Хейтер сосет члены на пару со своей мамашей
Небольшие фрагменты кода размещай в треде при помощи тега [code] и жабаскрипт-костыля. Для больших фрагментов используй внешние сервисы.
FAQ
Мотивация
Q: Почему стоит использовать именно C++?
A: Ни один язык не идеален, но по совокупности киллер-фич C++ оставляет все остальные языки позади. Вот основные три:
- Скорость
C++ действительно быстрый язык — вместе с C, его прародителем, они с большим отрывом уделывают по скорости все остальные языки высокого уровня. Код на C++, как правило, медленнее аналогичного кода на C приблизительно на 0-20% а в ряде случаев C++ оказывается даже быстрее, причем замедление появляется только при использовании высокоуровневых конструкций (в C++ ты никогда не платишь за то, чего не используешь). Таким образом, если тебе требуется высокопроизводительный код, C++ станет отличным выбором. - Мощь
C++, являясь одним из наиболее выразительных и мощных языков, позволяет использовать большинство существующих парадигм. Его философия построена на минимальном ограничении программиста в выборе методов и инструментовпростреливания ногирешения задачи. Как следствие, используя C++, ты можешь не думать о том, как обойти искусственные ограничения языка, а беспрепятственно выбрать наиболее подходящие к ситуации средства. - Популярность
C++ по-настоящему популярен. На нем написаны десятки тысяч приложений и миллиарды строк кода, о нем написаны сотни книг, он до мельчайших подробностей документирован и стандартизован. Используя C++, ты никогда не останешься без работы или поддержки комьюнити.
Литература
Q: Окей, я решил вкатиться. Какие же книги мне читать?
A: Специально для тебя аноны /pr собрали уникальную коллекцию отборной литературы по крестам. Только лучшие книги, последние издания, без хуев! Выбирай категорию и обмазывайся:
-
Для нюфань
Учебники для начинающих. Все примерно одинаковой годноты, читать имеет смысл только какой-нибудь один, который больше приглянется:
Автор(ы) Название Год Ссылка Бьерн Страуструп Программирование. Принципы и практика использования C++ 2016 https://yadi.sk/i/Yd6KKpLBqJSUr Стэнли Липпман, Жози Лажойе и Барбара Му Язык программирования C++ 2014 https://goo.gl/kVaela Стивен Прата Язык программирования C++ 2012 https://goo.gl/z7kA8u
Другие обучающие материалы
Q: Я не умею читать.
A: Можешь посмотреть какой-нибудь онлайн-курс: раз, два, три
Q: Не люблю, когда льют воду. Хочу коротких материалов по существу.
A: Вот тебе блоги, факи, референсы и всякое такое:
- Годный блог, в котором все просто и понятно тян не нужны кококок борщ
- Блог с хорошо расписанными фичами новых стандартов
- Краткие описания библиотечных функций и контейнеров - на русском или более подробно на ангельском
- Блог Герба Саттера (на ангельском)
- Блог Скотта Мейерса (на ангельском)
- Блог еще одной тянки, много о Qt и оптимизации (на ангельском)
- Куча других блогов (на ангельском)
- Большой FAQ по C++ (на ангельском)
- Видео с CppCon (на ангельском)
Софт и библиотеки
Q: Я готов начать погроммировать! Куда мне писать код?
A: На этапе написания хэллоуворлдов можно не ебаться с установкой софта, а использовать онлайн-компиляторы: раз, два, три, четыре. Для работы над более серьезными вещами удобнее всего установить какую-нибудь IDE. Ниже приведены несколько хороших вариантов:
Платформа | Название | Описание | Ссылка |
---|---|---|---|
Windows | Microsoft™ Visual Studio® | Общепризнанно самая продвинутая и удобная IDE, не имеющая равных по части автодополнения и возможностей отладчика. По ссылкам справа можно скачать бесплатную редакцию последнего выпуска (2015 Community Edition). Кроме того, существуют редакции с расширенными возможностями (Professional и Enterprise). Они стоят сотни денег, но если ты студент вуза, подписанного на Dreamspark Premium, то ты можешь получить их безвоздмездно (то есть даром). Многим новичкам интерфейс студии кажется чересчур сложным, так что обязательно прочти этот гайд, если у тебя возникают проблемы с компиляцией хэллоуворда | https://goo.gl/qgAAc6 (русская версия) или https://goo.gl/WIPW9L (ангельская версия) |
Все | CodeLite | Простая, легковесная, кроссплатформенная, швабодная IDE. Менее навороченная, чем студия, но среди бесплатных вне конкуренции. Вероятно, это наилучший вариант для новичка с *nix. Под Windows же требует чуть больше ебли с установкой компилятора MinGW/LLVM | http://codelite.org/, "sudo aptitude install codelite codelite-plugins" для установки под *nix |
Все | CLion | IDE, призванная похоронить Visual Studio пока не особо получается. Она стоит денег, но можно украсть почти не протухшую версию на торрентах или получить бесплатную лицензию на год по скану студбилета, если ты студент. Удобные свистелки и перделки присутствуют. Тормоза и баги присутствуют. Кросплатформенность присутствует | https://www.jetbrains.com/clion |
Q: Я прочитал все вышеперечисленное, теперь я гуру! Что дальше?
A: Дальше переходишь по ссылке, пробуешь отвечать на вопросы и понимаешь, что ты пока в самом начале пути. Кроличья нора крестов практически бездонна, поэтому продолжать постигать тонкости и детали можно очень и очень долго. В то же время, на этом этапе у тебя должно быть достаточно знаний, чтобы уверенно писать неплохой код. Поэтому читай исходники открытого софта и библиотек, отправляй пулл-реквесты в них, читай книжки по предметным областям и общим методикам разработки, а дальше уже сможешь запилить свой проект или вкатиться в существующий.
1C для илиты
Для илитки, высокомерных задротов, которые не смогли в Haskell.
>CodeLite
Почему он, а не Code::Block, помню еще несколько лет назад он был самым юзабельным из опенсорса.
Формально - никак. Стандарт ничего вообще не гарантирует о доменах для плавающих чисел, поэтому может не влезать в обе стороны. Единственный корректный вариант - каждый раз вручную сравнивать с INT_MAX или типа того. Но вообще, если у тебя возможны настолько большие числа, то проблемы будут не только с double, а вообще с любыми операциями из-за постоянных проверок на переполнение, поэтому лучше сразу прикрутить какую-нибудь библиотеку длинной арифметики и не велосипедить хуйни.
>CodeLite
>Code::Block
Вы два мудака, как же вы заебали с продвижением этого говна в каждом треде. Запомните:
Серьезные люди в продакшене юзают:
- MS VS
- Eclipse CDT
- XCode
- Qt Creator
- CLion
- Vim/Emacs
Всем, кто советует иное, можете плевать в лицо без раздумий.
>Стандарт ничего вообще не гарантирует о доменах для плавающих чисел, поэтому может не влезать в обе стороны.
Щито? Что такое домены?
> Стандарт ничего вообще не гарантирует о доменах для плавающих чисел
У тебя какой-то свой стандарт.
два сервис-пака этому господину
Множество значений, которые могут храниться в этом типе. Это для плавающих не то же самое, что диапазон - например, 1.0 превратится в что-то типа 1.00000002.
>>786647
Ну хорошо, мистер буквоед. Гарантируется, что long double может хранить значения из double, а double - значения из float. Ни ширина диапазонов, ни конкретные допустимые значения (в.т.ч. наличие NaN и +-Inf), ни направление округления, ни соотношения с диапазонами целых не гарантируются (например, реализация, в которой все плавающие имеют единственное значение NaN, вполне корректна с точки зрения стандарта). Некоторые гарантии предоставляет стандарт IEEE-754, но стандарт крестов не обязывает ему подчиняться. 3.9.1/8, 4.6, 4.8.
Этот standard lawyer прав. Алсо, факт следованию стандарту IEEE 754 можно проверить в рантайме с помощью std::numeric_limits<>::is_iec559()
> Ни ширина диапазонов, ни конкретные допустимые значения (в.т.ч. наличие NaN и +-Inf), ни направление округления, ни соотношения с диапазонами целых не гарантируются (например, реализация, в которой все плавающие имеют единственное значение NaN, вполне корректна с точки зрения стандарта).
Ты бредишь, прими таблеток. Как полегчает, взгляни на пикрелейтед.
> можно проверить в рантайме с помощью std::numeric_limits<>::is_iec559()
> static const bool is_iec559; (until C++11)
> static constexpr bool is_iec559; (since C++11)
> const(expr)
> в рантайме
Что ещё напишешь?
Это кусок сишного стандарта, причем одного из новых. Даже от старого сишного стандарта кресты зависят только в тех местах, где это явно указано в крестовом стандарте (например, для размеров целых чисел), а для плавающих таких упоминаний нет. Хочешь аргументированно поспорить - приводи выдержку из 14882 2014, где есть ссылка на этот твой 5.2.4.2.2, иначе с тем же успехом ты мог бы принести стандарт D или еще хуй знает что.
>>786854
Опровергни.
> Хочешь аргументированно поспорить
Хочу. Но ты уже начал доёбываться там, где негде.
>приводи выдержку из 14882 2014, где есть ссылка на этот твой 5.2.4.2.2
Пффффффф...... На.
Ну можно и не в рантайме, лол. Че доебался-то?
Таки кое-какие гарантии насчет плавающих есть. Пикрил из C11 стандарта.
А мне-то зачем ты показываешь? Я знаю про них.
Все, расходимся. Минимальные величины float гарантируются.
Я не доебываюсь, просто ты ошибаешься. Смотри, гарантируется текстуальная идентичность файлов. Не гарантируется идентичность ограничений непосредственно на типы (только опосредованно, через FLT_MAX etc). Не гарантируется, что у a<b в C++14 и C99 одинаковая семантика.
Возможна, например, следующая ситуация - в реализации C99 нормальное представление float через IEEE 754, а в реализации C++14 у float единственное значение NaN, не сравнимое ни с чем. В общем хэдере cfloat есть строчка #define FLT_MAX yoba, где yoba есть implementation defined константа какого-то implementation defined типа (в 5.2.4.2.2 не говорится ничего о типах, только о сравнимости), который можно сравнивать с float. К примеру, это может быть long long и его лимит, который оказался превосходящим 1E+37. Когда хэдер используется из C99, все работает очевидным образом - yoba сравнивается с 1E+37 по правилам сишного сравнения и, разумеется, оказывается больше всех конечных чисел. Когда хэдер используется из C++14, крестовая операция сравнения фейлится над единственным возможным значением NaN, а других нет. Смекаешь? Ты был бы прав, если бы в сишном стандарте было прописано требование включать в хэдер сам литерал 1E+37 - тогда из такой извращенной реализации крестов нельзя было бы подключить его без ill-formed исхода. Но этого требования нет, поэтому все требования на тип пропадают при изменении семантики трактовки хэдера с сишной на крестовую. Такие дела.
Из моих сообщений это уже давно ясно.
Нет же. Гарантируется эквивалентность значения, например, функции max () значению, которое есть в хэдере, который парсится из крестов, и семантика при этом не гарантируется совпадающей с семантикой парсинга этого же хэдера из сей.
>семантика при этом не гарантируется совпадающей с семантикой парсинга этого же хэдера из сей
Месье, в C11 и C++14 семантика сравнения fundamental types почти одинаковая и четко определяется.
Сударь, в приличном обществе с сагой не пишут. Вы заебали.
Да ты охуел, блядь, у нас тут не политач, чтобы маневрировать. Я тебе показываю конкретные дырки в твоих рассуждениях, из-за которых они ломаются, чтобы найти истину, а ты с лицом обиженки машешь своими убеждениями. Определись с целями уже.
Да, но она определяется в терминах "если a>b в математическом смысле, то a>b вернет true". Поэтому, очевидно, если значения a и b implementation defined, то и результат сравнения - тоже.
>Поэтому, очевидно, если значения a и b implementation defined, то и результат сравнения - тоже
Нет. Определен диапазон float, который минимально вмещает (-2^37, +2^37). Так что не может быть реализации, в которой float будет иметь один NaN. Кстати, ни NaN, ни INF стандартами С++ и C как раз не гарантируются.
>Кстати, ни NaN, ни INF стандартами С++ и C как раз не гарантируются
Спиздел, можете не спорить.
Почему спиздел?
Не спиздел, это правда. Даже чисто с точки зрения здравого смысла - если бы они гарантировались, не было бы проверки их наличия в numeric_limits.
>float, который минимально вмещает (-2^37, +2^37)
Разве? Там есть джва утверждения: любой float меньше FLT_MAX; 1E+37 меньше FLT_MAX. По твоей логике, если x<y и z<y, то x<z, так, что ли?
>любой float меньше FLT_MAX
любой float меньше или равен FLT_MAX
По стандарту ты можешь сделать:
float a = FLT_MAX;
>меньше или равен
Ага, пардон.
>float a = FLT_MAX
Да, в этом ты прав (я просто забыл о приоритете плавающих типов при преобразованиях аргументов).
Но получается такая штука - мы знаем, что у float в C такой диапазон, знаем из крестового стандарта, что текстуально хэдеры идентичны в крестах и C, но по-прежнему нет гарантий, что текст "float" в хэдере означает одно и то же в крестах и C. Где утверждается, что тип float из крестового стандарта это в точности float из сишного? Конечно, логично, что это реально так, но если уж мы разбираемся с гарантиями стандарта, то нужно подходить формально.
Заебал со своей высосанной из пальца конспирологией. Очевидно, что многие вещи в стандарте подразумеваются, а не прописываются явно. Никому (кроме тебя) не приходит в голову доебаться до чего-нибудь вроде того, что в стандарте нет гарантии, что буква "a" на одной странице эквивалентна букве "a" на всех других страницах. Или если стандарт ссылается на пункт 1.2.3.4, который прописан жирным шрифтом, а ссылка на него обычным — то должна быть гарантия, что это один и тот же пункт.
Это нихуя не подразумевается, лалка. В хачкеле есть Int, давай теперь считать, что и в крестах у целых длинная арифметика.
Как итерировать возвращенный из этой функции массив при помощи серийного оператора for?
https://ideone.com/MlRINI
>string (&f(int i))[10]
Ты тут возвращаешь одну строку, а не массив строк.
Указатель на массив = указатель на первый элемент.
Таким образом ты возвращаешь указатель на первый элемент.
Массив тебе просто так не вернуть из функции. Ты можешь вернуть только указатель на него.
В противном случае используй один из контейнеров.
Ты только понял?
>string (&f(int i))[10]
Впервые вижу такое.
Что делают квадратные скобочки в объявлении функции?
Почему функция объявляется как указатель?
Почему это компилируется?
Ссылки можно?
Аааа... понял. Он массив, типа, вернуть должен.
>>string (&f(int i))[10]
>Ты тут возвращаешь одну строку, а не массив строк.
c++decl> explain class string (&f(i))[10]
declare f as function (i) returning reference to array 10 of class string
Почему-то вот такие странные ошибки у меня: https://ideone.com/8CRHur
Как будто auto при вызове функции g выводит тип указателя, о которого нет итераторов.
>>787170
Не сажируй. Разобрался, вроде, и сделал с переусложненными определениями. https://ideone.com/7Wusga
До ссылок && пока не дошел.
А о такой штуке я даже не знал. Интересно, однако.
Кстати, почему у меня капча в тематике? Более того, такое впечатление, что там пенисы.
У змеи голова плавно переходит в тело.
Но стресс-ситьюэйшн - котелок плохо варит,
сервер для простенького чатика нужно реализовать с использованием потоков, а я туплю и не могу сформировать условие - что именно в этой ситуаци должен делать поток?
просто про потоки читал, но не соображу в каком контексте использовать. Сейчас ищу ответ на вопрос., но может двачер подскажет раньше.
спасибо
Ну самое очевидное предложение - использовать несколько потоков для обработки соединений с клиентами.
Хуёвая идея, если ты про потоки ОС – слишком большой оверхед.
Самая распространённая в веб серверах реализация – n+1 нативных потоков, между которыми шедулятся легковесные, которые как раз можно спамить сколько влезет.
Ну во-первых, никто не говорил про потоки ОС, во-вторых, никто я имел в виду пул потоков, а в-третьих, какая мне похуй разница, а? Анон просил любую идею, анон получил.
Да успокойся, обосрался и обосрался, я просто подсказал антоше в какую конкретно сторону рыть.
Нужно считать траффик на компе и записывать историю посещенных сайтов, что юзать?
А вот есть standalone-либа для реализации исключительно зеленых потоков и подобной хуйни? Вроде бы хочется иногда нашакалить вместо std::thread, но вечно оказывается, что вместе тянется какой-нибудь ебаный фреймворк, который тяжелее мамаши Энтони.
#include <csetjmp>
boost::asio
Подаю резюме на C++ джуна в аутсорсинговую компанию. Чего ожидать? Никогда не работал в аутсорсе, только в ламповых кухнях. Как выглядит работа джуна ремоут? Меня что, будут учить по скайпу? Есть ли специфика относительно C++?
Насколько будет сложно перейти от С к С++, если первый знаешь так себе и при этом немного писал на С# и Python. Хочу угореть по встраиваемым системам и компуктерному зрению.
Покажи-ка мне вакансию где синьором можно дома сидеть.
Вон Ванька Ерохин в офисе сидит уже 10 лет 5 на 8 и ты будешь, умный какой нашелся
Заканчиваю Таненбаума читать комп. сети основы.
Хотелось бы узнать как реально все проектируется, запиливается, подводные камни етц.
Желательно конечно на крестах/сишечке.
Чем вообще отличаются TCP/IP Illustrated от Network programming?
Первое это подробная работа стека протоколов, а второе уже реализация приложений, так?
я ньюфаг, так что не пинайте. Подскажите (дайте ссылку) минимальную/древнюю сборку mingw для компилирования в x-64 (достаточно стандарта 99) Спасибо.
Эккеля почитай, он как раз книжку для таких как ты писал.
https://ideone.com/dbpoTi
Вот у этих, например, почти все по удаленке работают: http://www.slightlymadstudios.com/careers.html
Самое интересное, что сие происходит только с функциями с Wtsapi
1>main.obj : error LNK2001: unresolved external symbol _WTSQueryUserToken@8
1>main.obj : error LNK2001: unresolved external symbol _WTSEnumerateSessionsW@20
~ fatal error LNK1120: 2 unresolved externals
Как это пофиксить?
#pragma comment("wtsapi.lib")
Либо, если у тебя Visual Studio: Правой кнопкой на проекте -> Свойства(Preferences) -> В левой колонке компоновщик(Linker) -> Ввод(Input), туда вводишь wtsapi.lib.
Если всё равно не залинкуется - проверь, может, он по-другому называется.
В GCC и подобном нужно в опциях сборки указать -lwtsapi. Но тут может сработать, а может и нет. Линковка в GCC вообще говно.
В шиндовом компиляторе тоже бывает такая же хуита как GCC, когда линковка может зависеть от расположения с списке зависимостей и фазы луны.
>Но тут может сработать, а может и нет. Линковка в GCC вообще говно.
Ебаный стыд. Хули ты советы даешь, умник, если man не осилил? Не работает у него, блядь.
>>788731
когда линковка может зависеть от расположения с списке зависимостей и фазы луны
Еще один, блядь. Порядок действительно влияет на результат, но это четко прописано в man'е.
Ты не знаешь, как работает auto. Почитай про вывод типа у Мейерса в новой книжке.
https://ideone.com/8DfwDo
Все правильно. В данном коде вторая функция не является constexpr и результат из function-call нельзя использовать как constexpr.
А если сделать scale(3), то результат будет constexpr
Нахуй так жить, поцоны?
Но почему тогда массив определяется, если его размерность не constexpr? Кланг компилирует точно так же успешно.
В глаза ебусь - не заметил этой массива.
Кароч clang очень умный и зоделол static values propagation. Сделай пример посложнее и работать не будет.
А то. Как и положено - 3 штуки. Я уже незнаю что происходит. clang code model вырубил - все норм. Но мне без него плохо.
Судя по всему этот плагин как-то пидорасит символ `__cplusplus`.
Можешь подробнее о static values propagation? Гугл молчит, но говорит, что значение в скобках должно быть constant expression, но:
https://ideone.com/B4hLLg
Другой анон
Смущает.
> Судя по всему этот плагин как-то пидорасит символ `__cplusplus`.
Отключил плагин - вот результат.
static values propagation - это сворачивание ситуаций типа:
int a = 4;
int b = a;
int c = b;
к:
int a = 4;
int b = 4;
int c = 4;
А с примера я тоже в ахуе. С одной стороны оно и понятно - массивы из C в современном c++ не используют. Но с другой стороны стало интересно. И в общем, это - расширение clang'а: http://clang.llvm.org/compatibility.html#vla
Т.е. это не по стандарту и в других компиляторах может не работать. Но там, где работает, эта запись будет эквивалентна "new <type>[size]"
Не пидорасит, а просто не определяет или определяет но с значением меньшим, чем 201103L
Не знаю насчет clang, а про gcc писали, что оно работает только для автоматических массивов, и вместо выделения на куче будет нормально пихать их в стек, типа вместо DEC EBP, const станет DEC EBP, yoba.
https://ideone.com/RkBGJz
Реализовать callbacks, очевидно же.
У тебя только определение функции g, реализации нет.
есть уж возвращать, то std::function, который абстрагирует функции и функторы
Функцию можно вызывать без разыменования указателя, просто pf(x, y).
>Какие профиты из этого можно извлечь?
Без контекста функции обычно мало полезны, поэтому возвращают классы или лямбды.
в TOOLS , на панели наверху, когда очередной раз скачал и установил - вместо RUN, вылезло Build with...
И эта хуйня каждый раз при запуске просит выбрать - просто билдить или с запуском. а мне нужно просто запуск делать.
Подскажите. кто юзает, в каком месте эта хуйня настраивается?
2. Пишу простой сервер-клиент. инструменты с++ и линукс.
приложение делаю с использованием std::thread. то есть многопоточность.
С сетями раньше не игрался. Вот нужен совет, в плане конструкции.
Насоветуйте плз, место для полета, куда можно воткнуть многопоточность, в указанном контексте:
типа отдельным потоком слушать клиентов,
потом отдельным потоком отдельных клиентов обрабатывать и прочее...
благодарю.
поясни.
просто я спрашивал относительно многопоточности.
и именно совет в плане использования, а не реализации.
может просто я не так понял
Затем я понадобилось тем же алгоритмом обрабатывать unsigned __int8 массивы. Я сделал копипаст с заменой типа везде + мелкие доработки (но на 99% алгоритм остался тем же самым).
В начале программы теперь идет ветвление, которое выясняет какой будут тип входных данных, плюс ветвление в конструкторе, деструкторе и одной процедуре.
Как можно все эти действия параметризовать? Шаблоны для этой цели созданы? Что в итоге работы шаблоном сгенерится? Тот же самый код с ветвлением? Как эта проблема решается в нормальных языках программирвоания, типа Haskell, Agda?
Сорри за ошибки.
>Шаблоны для этой цели созданы?
Да.
>Что в итоге работы шаблоном сгенерится?
Такой же код, как если бы ты вручную копипастил тело шаблона. Используешь для двух разных типов - будет два похожих куска кода.
>Тот же самый код с ветвлением?
Ветвление избыточно, если компилятор уже знает, какой нужен тип. С шаблонами в бинарнике останется только тот код, который ты реально используешь. Например, если ты заменил unsigned short на unsigned __int8, то код для второго типа автоматически сгенерируется, а код для первого - автоматически удалится.
>Как эта проблема решается в нормальных языках программирвоания
Полиморфизм бывает двух видов: ad hoc (это то, что будет с шаблонами) и динамический (с автоматическим "ветвлением"). В "нормальных языках" (например, в C++) доступны оба варианта на твой выбор.
На linux (убунту) если под редактор текстовый писать - как нибудь можно сделать чтобы программа запускалась в отдельной консоли?
Как на винде короче.
Под кодблок писал - там вылезало в отдельном окне.
Но я под виртуальную машину пишу , и на нем тормозит ide.
https://ideone.com/25foCq
Компилирую clang.
> Анон, какого хуя можно вызывать неконстантные методы у константного объекта?
Я не вижу этого в твоём коде.
Тогда что такое константный объект? Разве const Person p - это не определение константного объекта? В этом случае this должен иметь тип const Person *const
У меня в коде вызываются обычные функции у константного объекта. Обычной функции неявно передается this типа T *const. При вызове функции у константного объекта this имеет тип константного указателя на константный тип. Это должно вызывать ошибку компиляции, потому что типы this не совпадают: невозможно передать указатель на const объект как обычный указатель.
> У меня в коде вызываются обычные функции у константного объекта.
Ты, видимо, ошибся с кодом.
Вот как ты хотел.
https://ideone.com/PI7OVF
cat << EOF > run.sh
#!/bin/sh
xterm -e <path to your program>
EOF
chmod +x run.sh
И запускаешь run.sh вместо своей программы.
>С шаблонами в бинарнике останется только тот код, который ты реально используешь.
У меня вообще не в этом проблема. Проблема состоит в том, что я не знаю какого типа данные мне придут на вход. К примеру, это могут быть массивы чисел double, а могут быть массивы unsigned __int8. На этапе разработки и компиляции мне ничего не известно о входных данных. Но я должен предусмотреть обработку или всех или некоторых. В связи с тем, что мои действия по обработке схожи я хочу параметризовать входные типы.
Зачем тебе знать конкретный тип?
и юзаю сублим.
Такая ситуация : запускаю простое приложение сервера.
как я понял оно запускается в сайлент режиме - об этом я узнаю по ошибке, которую выдает сублим при следующем запуске - порт занят. как это гуглить - хз.
по-крайней мере понял что прога нормальная.
посоветуйте выход из ситуации?
как минимум запуск приложения в отдельном окне
>>789911
если это в настройки сублим пихнуть - будет работать?
std::enable_if, std::is_integral и так далее
Сижу - пишу код на linux (ubuntu)
Пишу tcp-server. Юзаю Sublime Text 2.
Такая ситуация в общем.
: запускаю простое приложение сервера. Оно мне жаловалось после одного запуска, что мол адрес занят.
А я только потом понял, что оно запускается типа в "сайлент режиме" - т.е если запустить "хелловорлд", то сублим выдаст результат в консоль. А если сервер - то никакого окна не будет. и не пойму как убить процесс запущенный.
и даже как проблему гуглить не пойму.
посоветуйте выход из ситуации?
как минимум, что бы отдельный запуск окна был.
Что-то донастроить. Или пересесть за другой редактор?
лалка, покомпиль из консоли для начала, чтобы разобраться с фазами компиляции и не задавать тупых вопросов. Каждую мелочь тебе никто рассказывать не будет. Про tcl ты прочитал, а про компиляцию, пайпы и демоны не прочитал. Ну и нахуй мучать жопу, когда срать не умеешь?
я знал, что ты так скажешь...
Это называется поиском Кенига (гугли Koenig lookup или argument-dependent lookup). Суть (упрощенно) в том, что при поиске функции по имени к текущему неймспейсу добавляются неймспейсы, в которых объявлены типы аргументов. Для переменной это, очевидно, не работает, потому что никаких аргументов у нее нет.
О, спасибо.
Стоит.
Аноны, вкатываюсь в c++,
объясните, в чем разница между
int x=(int)(228.7);
и
int x = 228.7;
cast operator vs implicit conversion
https://ideone.com/y3DdGI
В шапке говна мамонта в качестве литературы по С++. На носу С++17, а они всё книги из 2002 года читают. По сравнению с С++98 многое стало неактуальным, а некоторые старые практики попросту вредными.
Я бы советовал нбюфагам читать как можно более свежую литературу, пусть и не классику.
У Майерса к примеру по С++11 и 14 вышли книги, хуле их нет в списке?
Его не стоит, он даже проще Праты. А "Язык" можешь читнуть.
Есть там новый Мейерс, не ебись в глаза. Шапка составлена весьма грамотно, книги, которые действительно устарели, помечены как deprecated. В том же Мейерсе или Саттере советы практически не протухают, особенно если каждую идиому дополнительно гуглить, когда читаешь. А переписанных заново аналогов им нет (новый Мейерс рассказывает конкретно про фичи нового стандарта, а не правит старые указания), поэтому энивей лучше прочитать и потом немного подкорректировать, чем не читать вообще.
vim
Народ, поясните за хуйню.
Вот у меня
int pi = new int;
Вот я делаю
delete pi;
И что теперь? Что происходит в ебаной машине? В книжках по факту нихуя не говорится, блядь, как это все работает.
Я блядь один хуй могу взять после этого въебать такое
pi = 1;
cout << *pi << endl;
и все будет ок, будет работать.
Если я так правильно понял, просто потом, когда я следующий раз выделю память, то как раз на это место может указывать указатель, а если я не напишу delete, то на это место указатель уже не сгенерируется никогда? Я прав?
>Определить выше ее нельзя, потому что тогда ошибка будет из-за того, что ниже находится определение класса
Почему нельзя написать определение класса, затем определение функции, а потом уже реализацию класса и функции?
Вопрос на чисто поболтать, с примечанием :
Я вот буквально пару дней назад сел писать код в ubuntu.
Сижу, блять , ебусь с этой херней. Столько нюансов и прочее. Лень, но постараюсь не стать не неосилятром.
Буду тихо давить.
Поясните за программирование на unix.
Почему все так дрочат на него?
Я понимаю, что возможно высокий входной порок - дает почувствовать себя элитой. И понимаю, что возможные плюсы я еще не видел - ведь только сел за это дело.
В общем господа, поясните «чекаво»
>intЗВЕЗДА pi = new int;
В куче выделяется место, указанное платформой для переменной типа инт; в стэк идет переменная типа указатель на тип инт.
>delete pi;
В куче удаляется переменная, на который указывает pi, и заменяется null-ом. Освобождается ли память? А хуй знает, самому интересно, ведь null это тоже инт.
Но я могу быть и неправ, так как хуй простой, заменивший обучение по книге обучением методом проб и ошибок.
Ты меня не слушал штоле, сука, ебаная тетя? Для кого я объясняю? Сначала объявляешь класс (без тела, просто class YourMomma;), потом объяляешь функцию (просто void makeBorsch (YourMomma &);), потом, блядь, определяешь класс (class YourMomma {...};) и, наконец, определяешь функцию (void makeBorsch (YourMomma & momma) {...}). Теперь пиздуй реализовывать эту ебалу, а если еще раз придешь сюда с долбоебским вопросом, я приеду и лично выебу тебя в ленивую сраку, аутист, блядь, хуев.
На винде нет интсрументов/компеляторов/интерпритаторов. Ну и работать под никсами удобнее, так как все можно настроить под себя. Всё.
>почему все дрочат на него
Нихуя не дрочат, никсоиды вообще больше по сям. Алсо, шапка крестотреда вообще довольно сильно заангажирована под студию и венду, а любители пердолинга уже несколько раз на моей памяти были обоссаны спермогосподами.
Какого это компилятора нет на венде, ну-ка ну-ка? Из инструментов могу вспомнить разве что valgrind, но это уже скорее стиль мышления и разные подходы.
Продолжайся наслаждайся дальше еблёй с зависимостями на шинде, причём на всех стадиях. Только это всем юниксподобным системам уже даёт юуст на 9000 очков.
>я тот кто задавал вопрос.
Во во , я о том же.
Просто если ты хочешь писать код в итоге - стоят ли все эти лишние заебы того?
Вот тебе банальный пример - как Qt с бустом ставить будешь? или opencv и вообще любая библиотеканейм?
В юнипсе - сука апт-гет инсталл библиотеканейм-дев
Впрочем, на винде можно поставить msys - и через него ставить и компилятор, и небо и аллаха - там есть пакман как в арчике.
Если буст/Qt/OpenCV - с ними на шинде ещё всё более менее цивильно.
Но не дай, блять, бог тебе придётся собирать что-то с незавендоренными зависимостями (особенно ГНУтым говном, с кривыми портами пятилетней выдержки) - ты не надолго останешься на этой ОС.
>>790908
>там есть пакман как в арчике
Регулярных обновлений как в арчике нету, хотя раз в год популярные хуитки таки обновляют (но никсовым софтом вроде вима без гуя пользоваться невозможно).
>Регулярных обновлений как в арчике нету
Да ладно, я помню - все там нормально обновлялось, я юзал сабж.
И мингв, и куча говнолиб, и пиздон и его окружение оттуда ставил.
>И мингв, и куча говнолиб, и пиздон
Если они не обновлялись бы, смысла в этом проекте не было бы от слова совсем насколько я помню, это кстати уже не вторая и даже не третья попытка, где там его предшественники?
>gnuwin, unxutils и пр.
Про эту херню не слышал даже, а цыгвин - он изначально был не того.
Вроде недавно красношапка на него лицензию сменила кстати.
А msys был всегда, но раньше там был башик, а всю хуйню нужно было качать зип-архивами и ставить ручками, а с пакет-менеджером срало заебок.
Впрочем, я слышал, в десяточке уже родили пакетманагер. Это правда? И рабочие столы слышал - тоже впилили таки уже?
Столы – да (но их концепция всё же посасывает что у гномовской, что у макосовской, с которой содрана), покетманагера из коробки так и нету, просто пилят "убунту фор шиндовс" официально, когда нибудь да появится.
>и вообще любая библиотеканейм?
Ставишь mingw-w64, msys. Чего нет в мсисе, ищешь на rpmfind в mingw64-libname пакетах, распаковываешь, копируешь вручную. Хотя кросскомпиляция из под арчика в разы удобнее, конечно.
Я короче нуб и вообще нахуй не программист по специальности, но просто хочу попиздеть за С++, если хотите - доказывайте мне что я не прав, будем дискутировать, ток не обзывайтесь и не оскорбляйте на пустом месте, плес, тошнит от этого всего. Ну или оскорбляйте, мне похуй.
>они с большим отрывом уделывают по скорости все остальные языки высокого уровня.
Ну так-то да, только есть ньюанс. Во-первых, шарп в некоторых тестах либо равен либо чуть медленней с++ по производительности. Но это хуйня, есть более серьёзный ньюанс, как мне кажется. Короче, по сути в С++ из коробки нет нихуя. Да и с коробкой тоже. Хуй нагуглишь и подключишь какую-нибудь библиотеку для решения тривиальной для других языков задачи. Да, задача прикладная а плюсы ж ну эт тип крутой езык для системных погроммистов и шобы там на нём всякие крутые математические штуки писать)) Не удивительно, что на нём нет многих таких популярных библиотек и не справедливо ставить ему это в минус НО проблемы начнутся тогда, когда ты в отсутствии уже реализованного и поддерживаемого открытым коммьюнити функционала ебанёшь себе его сам. Сможешь ли ты писать свои библиотеки так, чтобы они работали быстрее чем встроенные / подключаемые библиотеки для других языков? Особенно когда в том же C# такой функционал пилился и поддерживался годами. Короче, это еще большой вопрос.
>Используя C++, ты никогда не останешься без работы или поддержки комьюнити.
Вот это самый пиздец, мне кажется. Ну, про помощь коммьюнити пиздеть не буду, да, хотя опять же, на тех же C#, Java, Ruby и Python гораздо проще найти топик на stackoverflow где коммьюнити уже для кого-то решило типичную задачу, с которой столкнулся васян, решивший просто без задней мысли написать несложное приложение для автоматизации чего-нибудь. Ну, например, редактирование пользователей через LDAP (ради интереса кстати погуглил как это на плюсах делается, пиздец, объем кода раза в 3 выше).
Ну и насчёт работы: как у меня сложилось впечатление, понятия джун-C++ вообще не существует, все ищут только рукастых специалистов с огромным опытом и знаниями (prove me wrong). Где их набирать в таких условиях - хуй его, блять, знает.
>в C++ ты никогда не платишь за то, чего не используешь
Вот эта фраза очень понравилась, да.
А вообще С++ считаю безусловно пиздатым и достойным изучения языком.
Я короче нуб и вообще нахуй не программист по специальности, но просто хочу попиздеть за С++, если хотите - доказывайте мне что я не прав, будем дискутировать, ток не обзывайтесь и не оскорбляйте на пустом месте, плес, тошнит от этого всего. Ну или оскорбляйте, мне похуй.
>они с большим отрывом уделывают по скорости все остальные языки высокого уровня.
Ну так-то да, только есть ньюанс. Во-первых, шарп в некоторых тестах либо равен либо чуть медленней с++ по производительности. Но это хуйня, есть более серьёзный ньюанс, как мне кажется. Короче, по сути в С++ из коробки нет нихуя. Да и с коробкой тоже. Хуй нагуглишь и подключишь какую-нибудь библиотеку для решения тривиальной для других языков задачи. Да, задача прикладная а плюсы ж ну эт тип крутой езык для системных погроммистов и шобы там на нём всякие крутые математические штуки писать)) Не удивительно, что на нём нет многих таких популярных библиотек и не справедливо ставить ему это в минус НО проблемы начнутся тогда, когда ты в отсутствии уже реализованного и поддерживаемого открытым коммьюнити функционала ебанёшь себе его сам. Сможешь ли ты писать свои библиотеки так, чтобы они работали быстрее чем встроенные / подключаемые библиотеки для других языков? Особенно когда в том же C# такой функционал пилился и поддерживался годами. Короче, это еще большой вопрос.
>Используя C++, ты никогда не останешься без работы или поддержки комьюнити.
Вот это самый пиздец, мне кажется. Ну, про помощь коммьюнити пиздеть не буду, да, хотя опять же, на тех же C#, Java, Ruby и Python гораздо проще найти топик на stackoverflow где коммьюнити уже для кого-то решило типичную задачу, с которой столкнулся васян, решивший просто без задней мысли написать несложное приложение для автоматизации чего-нибудь. Ну, например, редактирование пользователей через LDAP (ради интереса кстати погуглил как это на плюсах делается, пиздец, объем кода раза в 3 выше).
Ну и насчёт работы: как у меня сложилось впечатление, понятия джун-C++ вообще не существует, все ищут только рукастых специалистов с огромным опытом и знаниями (prove me wrong). Где их набирать в таких условиях - хуй его, блять, знает.
>в C++ ты никогда не платишь за то, чего не используешь
Вот эта фраза очень понравилась, да.
А вообще С++ считаю безусловно пиздатым и достойным изучения языком.
>ради интереса кстати погуглил как это на плюсах делается, пиздец, объем кода раза в 3 выше
Я от такой хуйни (ну и кучи другой) в дишку вскочил.
>либо равен либо чуть медленней с++ по производительности
Все правильно, и естественно, что для задач типа написания обычных десктопных приложений шарп подходит немного больше. Фишка в том, что когда тебе нужно писать и хуйню вроде гуя, и высокопроизводительную мякотку (вычисления, хайлоад), то удобнее делать все на одном языке.
>Хуй нагуглишь и подключишь какую-нибудь библиотеку
Это проявляется не так часто, как многим кажется. Для всех задач, под которые кресты хотя бы отдаленно подходят, есть куча годных либ. Разумеется, есть исключения, но я буквально по пальцам могу пересчитать случаи, когда я не смог нагуглить нужную мне либу. Уровень пердолинга с либами переоценен, уже давно все нормальные либы заточены под CMake и/или имеют пакеты в NuGet. А мелкие вообще зачастую header-only, там ебли нет по определению.
>Сможешь ли ты писать свои библиотеки так, чтобы они работали быстрее чем встроенные / подключаемые библиотеки для других языков?
Это не так сложно, как кажется. Не для ньюфагов задачка, но, покурив исходники библиотек, без особого труда можно написать свою пристойную.
>вообще не существует
Еще как существует, но рынок перенасыщен, ибо в универах учат крестам на околоджуновском уровне чаще, чем жабе или шарпу. Это проблема, да. В какой-то степени она компенсируется гарантией, что ты не умрешь от голода, т.к. всегда есть сотни долбоебов, которым нужно запилить лабу или курсач за пару косарей (по мне это лютый зашквар, но кому-то это может пригодиться, лол).
>Поясните за программирование на unix.
>Почему все так дрочат на него?
Хуйня полная, в основном слухи о суперпопулярности и незаменимости линукса распространяют дебилы, подобные местным петухам из /s/. Кстати, в /s/ можно заметить одну интересную вещь: там практически никогда не бывает пруфов зарплат/квалификации любителей порассуждать про ОС. Оно и неудивительно, т.к. вменяемый человек никогда не будет на полном серьёзе увязывать инструмент для решения задачи с какими-то личностными качествами самого решающего эту задачу.
Более того, хотя я и ненавижу майкрософт, нужно признать, что .NET платформа охуенная и развивается она охуенно сейчас. Лол, даже для линукспетухов версию выпустили.
Сам не перехожу на линукс (хотя и планирую) как раз ввиду того что внешне он убог и его надо не настраивать под себя, тут буквально надо допиливать ОС за разработчиков и криворуких дизайнеров.
В линуксе нет удобных хоткеев, к которым я привык в винде. Нету даже аналога Win+стрелки на клавиатуре, это охуенно, я чувствую себя как без рук без этого сочетания да и без остальных тоже. Всё вечно вкривь и вкось, на соплях приделано.
Смотри, зашел на двач - зажимаю колесо мыши, страница не скроллится. Ну, вообще. Браузеру просто похуй. Делаю один поворот колеса мыши - тред проскролливается НА СЕРЕДИНУ блядь, просто сразу. На работе была тема, что это говно само по себе вылетало на логинскрин закрывая при этом все мои открытые приложения. Я могу продолжать бесконечно, и понимаешь, вот в этом для меня суть линукса, это как почта россии - никогда не знаешь, где она тебя наёбет, но знаешь, что наебёт обязательно. Да, возможно на какие-то из моих аргументов мне ответят, что в линуксе есть аналоги, но нахуя я буду переучиваться, вот ради чего? Просто для того чтобы перейти на другую ОС? А зачем? Что она мне даст, кроме пердолинга?
И да, больше всего омерзительно, что мультиплатформенные версии программ под линуксом выглядят убого. Вот есть PyCharm я там пишу код на питоне и она в винде выглядит красиво и охуенно с моим шрифтом Input. Под убунтой... блядь, нутыпонел в общем.
Хотя надо сказать что работать только через сонсольку без гуи и поднимать всякие сквиды-роутеры писать скрипты и прочую хуйню под линь мне нравится, из консоли он прекрасен и никакая спермодесятка никогда даже не приблизится к этому. Короче, инструменты каждый выбирает по вкусу.
>>791024-кун
>Поясните за программирование на unix.
>Почему все так дрочат на него?
Хуйня полная, в основном слухи о суперпопулярности и незаменимости линукса распространяют дебилы, подобные местным петухам из /s/. Кстати, в /s/ можно заметить одну интересную вещь: там практически никогда не бывает пруфов зарплат/квалификации любителей порассуждать про ОС. Оно и неудивительно, т.к. вменяемый человек никогда не будет на полном серьёзе увязывать инструмент для решения задачи с какими-то личностными качествами самого решающего эту задачу.
Более того, хотя я и ненавижу майкрософт, нужно признать, что .NET платформа охуенная и развивается она охуенно сейчас. Лол, даже для линукспетухов версию выпустили.
Сам не перехожу на линукс (хотя и планирую) как раз ввиду того что внешне он убог и его надо не настраивать под себя, тут буквально надо допиливать ОС за разработчиков и криворуких дизайнеров.
В линуксе нет удобных хоткеев, к которым я привык в винде. Нету даже аналога Win+стрелки на клавиатуре, это охуенно, я чувствую себя как без рук без этого сочетания да и без остальных тоже. Всё вечно вкривь и вкось, на соплях приделано.
Смотри, зашел на двач - зажимаю колесо мыши, страница не скроллится. Ну, вообще. Браузеру просто похуй. Делаю один поворот колеса мыши - тред проскролливается НА СЕРЕДИНУ блядь, просто сразу. На работе была тема, что это говно само по себе вылетало на логинскрин закрывая при этом все мои открытые приложения. Я могу продолжать бесконечно, и понимаешь, вот в этом для меня суть линукса, это как почта россии - никогда не знаешь, где она тебя наёбет, но знаешь, что наебёт обязательно. Да, возможно на какие-то из моих аргументов мне ответят, что в линуксе есть аналоги, но нахуя я буду переучиваться, вот ради чего? Просто для того чтобы перейти на другую ОС? А зачем? Что она мне даст, кроме пердолинга?
И да, больше всего омерзительно, что мультиплатформенные версии программ под линуксом выглядят убого. Вот есть PyCharm я там пишу код на питоне и она в винде выглядит красиво и охуенно с моим шрифтом Input. Под убунтой... блядь, нутыпонел в общем.
Хотя надо сказать что работать только через сонсольку без гуи и поднимать всякие сквиды-роутеры писать скрипты и прочую хуйню под линь мне нравится, из консоли он прекрасен и никакая спермодесятка никогда даже не приблизится к этому. Короче, инструменты каждый выбирает по вкусу.
>>791024-кун
сплошное кукареку на тему производительности. Как и в шапке. Либо неси тесты, либо иди нахуй.
Кстати, я же забыл написать зачем я приложил скриншот. Посмотри на этот скриншот, блядь, в 2016 году нет сортировки по сетке ахах блядь, мне даже добавить нечего, остановите я сойду нахуй.
Шапку писали уважаемые люди, манька. Неси контрпримеры или уебывай. Кококок найдены данные, на которых хаскелл быстрее ассемблера в миллион раз!!!!11111
>неси тесты
Не, впизду мне лень, да и похуй. Не хочешь, не верь, все равно я аргумент со скоростью работы не выставлял как основной, так что мне похуй такщемта.
P.S. Хотя своими глазами видел на стэке как кто-то восхищался самонаписанному тесту где шарп натурально ебёт по производительности плюсы. Суть теста не помню, т.к. не шарю и ссылку не дам, лол.
Манька - это ты. А я - уважаемый человек, как ты сам выразился. Но это не меняет того факта, что в шапке тема производительности описана крайне стереотипно и не включает каких-либо примеров.
Их и не может быть вообще-то, потому что никто в здравом уме не будет писать два огромных приложения на разных языках только для того, чтобы сравнить скорость языков.
И, кстати, это не я должен доказывать обратное, а ты - утверждение.
Так что на данный момент есть вопрос без ответа. Что быстрее: ПО на медленном языке с оптимизацией горячих точек на C или ПО на C++.
>Их и не может быть вообще-то
>это не я должен
>с оптимизацией горячих точек на C
Вот это да, я такие тройные бочки даже в /po не видел.
Берешь и сравниваешь самую хуевую реализацию на крестах и самую лучшую на шарпе, профит. В качестве бонуса можно продемонстрировать простыню говнокода на крестах, подразумевая, что это норма. Я ничего не имею против шарпа, и этот подход работает в обе стороны с двумя любыми языками.
Нет нет нет нет, я не настолько тупой, во-первых пример там был достаточно простой, чтобы я смог его понять, и существенных отличий в реализации там не было, во-вторых тот топик на стеке был достаточно популярен, туда набежало куча крутых специалистов (лол) и я уверен, что если бы там было всё как ты описываешь ему бы незамедлительно на это указали (ведь правда?) и обоссали бы, и тогда я бы даже не стал этот пример упоминать. Сейчас пытаюсь найти тот тред, безуспешно.
Фото рассчётных листков с указанием должности, любые фото сертификатов с пруфами. Фото полузамазанных бейджей из яндекса/интела с пруфами (хотя последнее ладно, понятное дело что не все хорошие специалисты в яндексах работают). То есть вот пишет ебанутый про анального господина и все такое там, и чтобы прям рядом фотка какого-нибудь сертификата по специализации RHEL и т.д. Суть в том, что я себе такую ситуацию просто даже вообразить не могу, т.к. не могу вообразить ни одного из многочисленных микрософт/циско/джунипер/авайя/линукс профешшионалов с которыми я общался говорящими то, что говорят обычно в /s/.
А вот и аутисты подъехали.
Еще раз: нет никаких вменяемых сравнений одного и того же продакшен кода ПО на разных языках. Поэтому формально нельзя говорить, что проекты на C++ работают быстрее, чем проекты на других языках. Маня-тесты каких-нибудь коллекций будут либо одинаковыми(например в питоне словарь и массив - простые обертки над C-кодом, как и половина стандартной библиотеки), либо нихуя не будут отображать ситуацию в продакшене, потому что умные люди запилят критические места на C.
Так что спор на тему "язык A быстрее языка Б" в наше время - яркий представитель специальной олимпиады.
Спасибо. Я понял,
>нет никаких вменяемых сравнений одного и того же продакшен кода ПО на разных языках
есть http://benchmarksgame.alioth.debian.org/
>Скачан: 1232 раза
Хуя. Это получается, у меня будет ещё 1200 конкурирующих макак, и расчитывать на работу в РФ, связанную с крестами, ньюфагу смысла нет?
Где ты увидел продакшен код по ссылке, мудила?
Сплошные алгоритмы там.
Поясняю для совсем тугих: бизнес-логику пишут на удобном языке, потом ее гоняют профайлером и переписывают критические участки на C++ или C.
Мы вам перезвоним
под unix : как заRUNить два проекта одновременно (они друг другу пакеты шлют, вроде) не хочу изворачиваться.
Просто видел видос, где парень просто среду дважды запустил, но я не понял как он это сделал.
>бизнес-логику пишут на удобном языке
Этот удобный язык может быть и достаточно быстрым чтоб не переписывать.
Scala, Java, C#, Lua.
50% из них даже не откроет скачанное.
25% только посмотрят и закроют.
12% будут пытается что-то сделать больше 1 часа.
Проиграл с тебя.
>Я прав?
Да. Он где-то там у себя записывает, что память свободна.
>Я блядь один хуй могу взять после этого въебать такое
Где как. Вижуал студия не даёт даже обратить к pi после удаления, XCode же даёт и новое значение присвоить. ideone, как говорил >>790863, обнуляет память.
Я тоже хуй простой, могу деталей некоторых не знать.
Есть определенная иерархия папок. Надо все их просканировать на *.h файлы. Во всех папках надо найти все конструкции вида #define IDD_WIZARD_PAGE 101 и распарсить их, составив словари IIDD_WIZARD_PAGE - 101 для каждой папки.
Программа должна уметь:
1) Игнорировать часть папок. Список папок задавать в отдельном файле.
2) Показывать дубликаты. Дубликатом считать если число одинаковое в разных папка, а ID разное.
3) Выводить на экран список занятых диапозонов значений для конкретной папки.
Аноны, чувствую себя идиотом, но как нормально скомпилировать первый хэлоуворлд из книги Шлее "Qt 5.3. Профессиональное программирование на C++"?
Kdevelop топовый.
Правильно ли я понимаю, что для реализации метода add мне нужно ещё и "геттеры" добавить для получения x и y у объекта m? В задании ничего не сказано, просто описания методов сделать. Но ведь по-другому же я никак не могу до m.x и m.y добраться (по крайней мере, с текущими знаниями). showmove, насколько я понимаю, предполагает лишь текстовый вывод. Очевидно, что перенаправлять вывод cout'а и парсить полученный текст звучит немного сумасшедше.
Хм, стоило-таки вслепую попробовать перед постом. http://ideone.com/noyZcG
Внутри метода одного объекта можно обращаться к приватным атрибутам другого объекта того же класса, что ли? Что-то я не врубился.
я не могу,у меня задание такое,в общем у меня примерно такие мысли :
Реализовать класс деревьев, у которого для каждой вершины(папки) будет вектор в котором будут лежать указатели на новые вершины(подпапки). Далее будет метод, который будет рекурсивно вызываться и при помощи функций FindFirstFile , FindNextFile заносить директории в вектор вершины дерева, также, будет метод, который позволит из вектора достать эту директорию. Потом, по этим директориям можно будет открывать файлы для записи и для чтения. Также нужно организовать некоторое условие, что если в названии папки есть ".h" то её нужно открывать. Ну, а после уже - парсинг этих файлов.
Хотя мне кажется это какие-то пиздецовые велосипеды,но я лучше ничего не вижу.
Умные аноны ещё сказали mapы использовать
Съеби.
А при чем тут это? Я про книжку, а не про то, какая там версия Qt уже релизнулась.
Наверно к тому, что с релиза Qt5 прошло уже 4, сука, года – наверно уж по есть литра, сам-то как думаешь?
в qtcreator все должно работать без проблем.
В студии надо аддон ставить неофициальный, т.к. официальный с 2015 вроде не работает
После delete - мы маркаем участок памяти как удаленный. Что с ним будет делать компилятор, ось и так далее - не важно. Сразу ли память освободится? Implementation defined. Самое важное - что любое обращение к удаленному указателю - это UB.
>50% из них даже не откроет скачанное.
Вот кстати знакомо. Половина накачанных мной учебников и просто научпопа лежат "на будущее", когда реально в текущий момент я читаю от силы 2 книжки, читаю постепенно и вдумчиво. Часть уже вообще удалил, потому что передумал изучать описываемые в них темы, лол. Ещё часть не осилю скорее всего никогда, потому что не хватит времени на прочтение "всех хороших книг".
Пенсии не будет, сдохнешь раньше.
Уебищную императивную дрисню не получится сделать красивой, как код на лиспе, но можно улучшить.
На SO подобный код отхуесосили за то, что в функцию передается не итератор, а указатель на Node, и хуесосящий сказал, что надо зделоть что-то вроде Reverse (ListIter head). Но тогда итератор объявляется как нечто вроде typedef ListIter Node * или тут не уверен с использованием using. Но зачем это нужно, если в таком случае итератор это просо псевдоним для указателя на Node?
А хули ты сюда вообще зашел? У тебя сишный код без использования C++. cout не в счет.
Зделой классы
В настройках чекбокс был Allow multiple instances или что-то наподобею
именно, иначе для копирующих конструкторов и присваиваний надо было через геттеры все кишки наружу вадавать.
Нахуй нужен блокнот когда есть кодблокс?
Ебануться. Ссылки, указатели. Нихуя не понятно. Ссылка не обьект. Указатель может ссылаться на ссылку, ссылка на указатель нет. Ебанутая теория просто. Читаю Липмапа из шапки. Или это перевод хуевый либо я тупой. Невозможно понять ебанутый сухой текст с припезднутыми примерами, указатель в указателе Пошло нахуй.
5:11 утра, да я ебнутый
Наоборот таки, у него все последовательно и для даунов. Начинать советую с него.
Все нормально с работой.
Ебучие квадратики бы не лагали так на исторической хуите, как лагают на топовых железках сейчас.
есть minetest
>Зделой классы
Попытался сделать шаблонный класс, но он не инстанцируется для строк. Что я делаю не так?
Как улучшить дизайн класса?
https://ideone.com/z6ohEn
Блять, ебаный C++. Когда из простого класса делал шаблон, в конструкторе, принимающем istream, оставил T temp = 0, которое было для инстов. И компилятор на это даже не ругнулся.
Для возможности вызывать методы цепочкой добавил уебищной дрисни в сигнатуру reverse().
https://ideone.com/VhHI57
Указатель на ссылку не может существовать, так как ссылка - не объект.
Ссылка на указатель может существовать, так как указатель - это объект.
У тебя очень плохой перевод.
Не шапку, а заголовок.
вот я хочу спросить за подводные камни.
задача похожа на thread из стл11 в классе. так чтобы я юзал методы из класса в функции треда
>только проблем наберешь.
и в каком плане проблем?
выстрел в ногу или течь в памяти?
просто как реализовать в функции не в методе класса работу с обьектом класса?
Сделать в классе методы, которые эта функция сможет подергать у объекта, который в нее передали?
ну тоже вариант, но думаю не вмоей ситувации
функция это уже метод который я дернул с класса
пилерейтет
https://ideone.com/I7w3oJ
Бедненький, тебя наверное в гугле забанили?
Ну я помогу: http://stackoverflow.com/questions/26077807/why-does-gcc-allow-a-const-object-without-a-user-declared-default-constructor-bu
>Слышал, что там 200 зеленых сняли с некоторых за услуги. С тебя брали?
Нет. Что за бред? Upwork, конечно, охуел в последнее время, качество сайта и программыы падает, а комиссии растут, но не настолько, чтобы бабло без предупреждения забирать.
Спасибо, няша. Можно я тебе отсосу?
Есть одна замечательная функция.
JNIEXPORT void JNICALL Java_ru_test_ogles_JniWrapper_setTouchPoint(JNIEnv env, jclass type, jfloat x, jfloat y)
Которая как мы видим принимает jfloat. Это jfloat я хочу напечатать в консоль с помощью
int __android_log_write(int prio, const char tag, const char *text);
Так вот мне накастовать на jfloat char или ещё какую конверсию провести
"применение операции взятия адреса & к имени массива позволяет получить адрес всего массива..."
Что, какой нахуй весь массив блядь, если это просто адрес? Адрес ебучего первого элемента? Поясните, пожалуйста
Вроде как в этом смысл, да? Тип эта программа выдает такие результаты? Именно это имел товарисч Прата?
Я понял. Эта хуйня мне буфер заполняет, который я могу затем принтить. Какой ебаный гемор с вашими ссями.
Я бы не сказал. Вот например следующая проблема.
Я хочу сделать какой нибудь дженерик класс, который бы мне печатал любую хуйню, какую бы я в него ни запихнул.
Как мне передать в функцию любую переменную(объект), не перегружая функцию несколько раз.
Что просто так не работает? При чём тут язык? Если в яве был бы такой же уёбищный апи – это была бы проблема языка?
Правильнее "если бы на яве такой же апи написали".
Причем тут уебищный апи? Да, я с этим согласен, он уебищный.
Но на данном этапе я хочу сделать дженерик класс, который бы этот уебищый апи к логгеру убирал бы от меня. Ты предложил сделать это темплейтами, но т.к. языка я по факту не особо знаю, то у меня с имплементацией этой задачи возникают проблемы.
Хидер:
template<typename T>
class Logger {
public:
void d(char const TAG, T value);
};
Имплементация:
template<typename T>
void Logger<T>::d(char const TAG, T value) {
char buffer[64];
snprintf(buffer, sizeof(buffer), "%d", value);
__android_log_write(ANDROID_LOG_DEBUG, TAG, buffer);
}
Попытка использовать из другого места:
Logger<jint> *logger;
logger = new Logger();
logger->d(TAG, x);
В итоге получаю пизды:
Error:(26, 18) error: expected type-specifier before 'Logger'
Причем тут уебищный апи? Да, я с этим согласен, он уебищный.
Но на данном этапе я хочу сделать дженерик класс, который бы этот уебищый апи к логгеру убирал бы от меня. Ты предложил сделать это темплейтами, но т.к. языка я по факту не особо знаю, то у меня с имплементацией этой задачи возникают проблемы.
Хидер:
template<typename T>
class Logger {
public:
void d(char const TAG, T value);
};
Имплементация:
template<typename T>
void Logger<T>::d(char const TAG, T value) {
char buffer[64];
snprintf(buffer, sizeof(buffer), "%d", value);
__android_log_write(ANDROID_LOG_DEBUG, TAG, buffer);
}
Попытка использовать из другого места:
Logger<jint> *logger;
logger = new Logger();
logger->d(TAG, x);
В итоге получаю пизды:
Error:(26, 18) error: expected type-specifier before 'Logger'
Макаьа как обычно всё через анус сделала. Короче – ты шаблон после new пребал.
>>792768
Ok.
Logger<jint> logger = new Logger<jint>();
logger->d(TAG, x);
Получаю
Error:(28) undefined reference to `Logger<int>::d(char, int)'
http://ideone.com/xfeWEd
Ты серьёзно? Иди лучше книжку по плюсам хоть вертикально прогляди для начала.
>char const
Местами ничего не попутал? const в плюсах в зависимости от расположения может означать 3 разные вещи.
>Error:(28) undefined reference to `Logger<int>::d(char, int)'
Давайте поиграем в гадалочку x - int, а шаблон - jint?
>Ты серьёзно?
Да.
> Иди лучше книжку по плюсам хоть вертикально прогляди для начала.
Нет.
>>792779
typedef int jint;
Так что тут ни в какую гадалочку играть не надо. Тип может вообще любой прилетать. Хоть jfloat который по факту float.
Ах да, твой код выдает
Error:(27, 10) error: 'logger' does not name a type
Error:(31, 5) error: 'logger' was not declared in this scope
Logger.d(TAG, любой аргумент);
Почему это блять так сложно?
А, так это 20% с заказа. Не заметил.
>нихачу учится, хачу хуякхуяк и в продакшен
Захочешь как что-то сложнее шаблонной функции понадобится.
>>792784
>c++98
Это вообще пушка.
>>792787
http://ideone.com/4s3mwn
Хуй знает есть ли в твоём прогнившем древнем говне вместо компилятора дедуктивный вывод шаблонов, если будут ошибки - подставь <int> перед скобками.
Не знаю, спроси того кто скинул в апворк треде на /wrk/.
https://ideone.com/rQIdHF
1. Если объявляю его как член класса, возникает ошибка "Оператор должен быть бинарным, но он принимает 3 аргумента".
2. Если объявляю как friend, то я не знаю, как правильно обратиться к его внутренним данным и типам для вывода списка.
Я уверен, что имеется ввиду тип указателя, который возвращается при использовании имени массива или при использовании указателя на массив. Смотри скрин.
Читать умные книжки не пробовал? В страуструпе написано. А еще написано на cppreference (ее пилят чуваки из комитета стандартизации)
http://en.cppreference.com/w/cpp/language/operators
Норм прога? Или какую лучше выбрать?
нинужно
>Читать умные книжки не пробовал?
Да блять, я и так читаю Липпмана, но до нужной главы еще не дошел. Обычно мне хватало гугла для решения проблемы, но теперь я в тупике.
Лучше используй cppreference, больше толку будет. Алсо, C4Droid (который у него в похожих) это годнейший порт gcc за авторством местного анона, рекомендую.
Понял, спасибо
Вот образцовый пример, глядите, посоны. Эти необучаемые вырожденцы не понимают даже, что от порядка термов зависит семантика, а вы хотите, чтобы они понимали кресты. Вероятно, подобно тому, как "годнейший порт gcc" волшебным образом мутирует у них на устах в "порт годнейшего gcc", многочисленные дефекты родительских умов превращаются в их собственные, только уже в реальности.
Там проблема в линковке, вся хуйня должна работать, а он говорит что хуй не могу референс найти. И такая хуйня с любой либой
двачюю. Qt очень мил
нахуй твой блокнот, советуй что нибудь годное
Без знания ангелького C++ не нужен.
Как будто это нельзя решить за 20ку на какой-нибудь барахолке
>но в vs дебажить поудобнее
Типа F11 удобнее жать, чем F6? Стабильность дебагеров одинаковая. Содержимое окошек одинаковое. Плюс lldb к тому же умеет в вызов функций прямо из дебаг-консоли.
vs сосет в этом плане.
auto t = std::thread(foo, 2);
Как мне сделать такое для своего класса?
гугли perfect forwarding, std::forward
а) Variadic template и всё, что с ним связано.
б) callable
Ну и тупо посмотреть как работает thread
Ебтвою мать. Я все понял. Конфигурация идет полностью через гредл, а не по старинке через android.mk и application.mk. Из-за этого ни мои либы ни встроенные либы не работали.
Они о членах, очевидно же.
Google C Compiler
код такой
http://pastebin.com/7QVRuyL6
#include <iostream>
using namespace std;
int main()
{
int *p = new int;
return 0;
}
Я, далее, использую g++ для создания исполняемого файла temp. Затем я запускаю программу. Что произойдет? Я не освободил память, теперь где-то в оперативной (оперативной?) памяти у меня 4 байта ебаные схавала моя прога? Навсегда? До следующего ребута? До завершения выполнения программы? Простите, я очень тупой, но хочу разобраться.
блядь, \t табуляция ну вы поняли, скопирнул с пастебина
До завершения твоей программы. На дворе не 85 год, и ОС ныне не работают в реальном режиме.
>ОС ныне не работают в реальном режиме.
тут канешна хуйню сморозил
всё ещё есть мк/цпу без mmu
почитай Таненбаум "Операционные системы". Небольшая книжечка - и всё понятно станет ( я ещё и на английском, помню, читал - один хрен всё понятно, слов не много используется )
что такое виртуальная функция и как оно работает
что такое auto_ptr
как делать хуяк-хуяк и в продакшн
Как использовать не знаю, но знаю шо это. У Таненбаума бегло прочитал.
Аутоптр ушел гуглить. Пиши еще
Удваиваю вопрос.
Хочу из джавабляди перекотится в плюсогосподина.
Что нужно осилить в первую очередь? Зогплаты выше? Геморрой стоит свеч?
Если я не понимаю книжку Стенли Липмана я безнадежен или можно обмазаться чем-то по проще.
зависит от конторы, не плохо шарить хотя бы в stl, если пишут под винду - winapi,знать стандарты до с++14,могут задавать странные вопросы,еще про линуху
Ну, очевидная причина - кто-то создает объект, которым потом пользуются из других мест и функций. Для этого используется куча и указатели на нее, потому что иначе пришлось бы лепить огромный ком из всех существующих данных и постоянно футболить его между функциями через стек, несмотря на то, что каждая функция использует ничтожную долю этих данных. Был бы каждый раз дичайший оверхед на копирование этого дерьма, проблемы с удалением чего-либо из середины кома, ну ты понел. Куча же позволяет схоронять данные на стороне, чтобы они не протухали и ждали своего часа, а доступ к ним обеспечивается через указатели.
Менее очевидная, но не менее важная причина - оптимальность. Даже если объектов мало, они могут быть большими, а размер стека часто довольно жестко ограничен (например, 1МБ, в который, например, не влезет массив уже из пары миллионов чисел). Если пихать такие данные в стек (например, передавая по значению), то стек может очень быстро закончиться и настанет пиздец. А куче доступна практически вся оперативная память, поэтому туда можно пихать все, не особо задумываясь о размере. А на стеке оперировать уже маленькими указателями-дескрипторами.
>Ну, очевидная причина - кто-то создает объект, которым потом пользуются из других мест и функций.
А как он может использоваться ещё где-то, если он unique?
smart-pointer'ы привязывают время уничтожения объекта к стеку. Как и обычное выделение на стеке. Но стек довольно маленький (в macos, например, 8МБ) и на нем нельзя размещать все подряд. Поэтому мы выделяем память в куче, но время жизни привязываем к стеку.
unique используется для задания владения, а не доступа. Ну вот представь, что у тебя есть дневничок, ты пишешь в него разную ебалу, а другие аноны ее читают и комментируют. Но владеешь им только ты, и только ты можешь принять решение снести его на хуй. Когда снесешь - никто больше не сможет его читать. В терминологии крестов у тебя бы был unique_ptr на дневничок, и ты раздавал бы анонам обычные указатели или ссылки на него, которые не дают права владения и могут протухнуть. Аналогично, если бы ты создал конфу, живущую до последнего читателя, то у всех был бы shared_ptr, и единоличного владельца бы не было.
Ты только что описал weak_ptr. unique_ptr это, например, тебе заказали прокачать аккаунт в дотке. Тебе дают логин и пароль, изначальный владелец не может войти, пока ты играешь (ограничения стима). В один момент времени аккаунтом владеет только один человек. После того, как ты прокачал, ты отдаешь аккаунт обратно, чтобы тот играл в дотку.
ABI - это не про это. Это про то, как растет стек, какой порядок бит используется, как передаются аргументы в функции и т.д. А как реализовать виртуальные функции - это забота рантайма C++
>ABI - это не про это...
https://mentorembedded.github.io/cxx-abi/abi.html#vtable
> виртуальные функции - это забота рантайма C++
С этого места поподробнее, пожалуйста.
да, ты прав
Написать красно-черное дерево.
Тут написано следующее. Костыли на си++ пишутся таким образом:
1) Ты создаешь класс. У него есть поля (переменные, структуры и т.д). А также методы.
2) Ты можешь поместить поля в протектед и теперь снаружи сможешь получать к ним доступ только через специально написанные для этого методы. Обычно они называтся геттеры и сеттеры (get и set)
"Захуя все это нужно?", -- спросишь ты и совершишь большую ошибку, т.к. в тебе впервые закрались сомнения в адекватности си++-манямирка. Чем больше ты будешь изучать си++, тем более нелогичным тебе будет казаться то, как он устроен. Однако, релизигиозные фанатики будут продолжать тебя уверять, что это лучший путь жизни. Сектанты, хуле.
Нет, судя по примеру там написано то, что доступ к переменным и методам можно получить либо через ., либо через -> с помощью переменной. Для доступа к типу, определенному в классе, надо использовать :: и имя класса.
Сразу видно дебила, который ни разу не писал что-то большое на C. Там ты будешь заниматься абсолютно тем же, что и в C++, но руками эмулируя функции-методы наследование, полиморфизм и ограничение доступа к данным.
>Захуя все это нужно?
Потому что это логично. Инкапсуляция же. Данные должны изменяться ТОЛЬКО определёнными в классе методами. В Руби, например, вообще невозможно сделать доступные снаружи переменные экземпляра.
если переменная b в 2 скобках это значит что , d ссылка на переменную a ?
auto - определенно стоит использовать, decltype тоже помогает, хотя реже. В основном, в шаблонах.
>>795128
Это особенность работы decltype. Где-то я читал объяснение, что выражение в круглых скобках рассматривается, как lvalue, поэтому выводится тип как "ссылка на тип a". Хотя могу ошибаться.
спасибо анон, а не подскажешь когда нужно и когда не нужно использовать auto, я не очень понимаю для чего он
> я не очень понимаю для чего он
чтобы писать auto вместо std::iterator<std::vector<std pair<>>... (еще километр говна)
до такого говна я еще не дошел, спасибо)
>>795136
Да, типа того. Ну и без auto ты никак не сможешь определить лямбду, потому что ее тип выдумывается компилятором самостоятельно.
Ну и вообще удобно использовать в любом месте, чтобы не приходилось менять тип в сотне мест.
Вообще, можешь посмотреть примеры использования в гайдлайнах от Страуструпа:
https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md
годно, спасибо
говно ваша джява, сам катись.
>Ну и без auto ты никак не сможешь определить лямбду, потому что ее тип выдумывается компилятором самостоятельно.
Вась, а ты уверен что как следует просмотрел доку?
[](myYobaLambda arg) -> bool {
return true;
}
Найс, забрал
И ничего я не стирал. Купил новую.
Студент из репортинг
Дали анкету, 9 заданий, нужно написать их на листочке:
Сумма цифр в числе
Побитовый реверс числа
Среди четырех миллиардов интов найти такой, который не встречается в массиве
Среди кучи точек на плоскости найти те, которые образуют треугольник с макс периметром.
Сделал вроде как все. Были еще задания, но я не помню их уже.
Мне кажется что всё же ты верблюд. В моём примере вывода типов нахуй не нужно, а вот ты ничего не обосновал за базар свой.
>Среди четырех миллиардов интов найти такой, который не встречается в массиве
Какой максимальный размер массива? Хэш-таблица тут сойдет?
Максимальный размер - четыре миллиарда, ты читать умеешь? Можно использовать до 1Гб памяти
Ты ебнутый? У тебя есть последовательность четырех миллиардов инстов и есть какой-то массив. Среди интов надо найти значение, которого нет в этом массиве. Если ты собрался искать значения, которого нет среди миллиардом интов, ты получишь бесконечное количество таких чисел, потому что множество целых чисел счетно.
Я понял, что хуево написал условие. Тебе дан массив, размера 4 миллиарда. Ты должен вернуть такое число, которое не присутствует в этом массиве
>Ты должен вернуть такое число, которое не присутствует в этом массиве
Ебать дебил. Целых чисел бесконечное количество, а твой массив конечен. Поэтому можно вернуть дохуя чисел, которых в массиве нет. Например, любое целое число, которое не помещается в тип int.
Что за мрази дают такие тупые задания? Вас, дегенератов, надо всех через матфаки пропускать, чтобы учились давать четкие формулировки и не использовать термины, для которых нет однозначного определения.
>кажется
хуяжется
> В моём примере вывода типов нахуй не нужно, а вот ты ничего не обосновал за базар свой.
Всем (кроме тебя) ясно, что там имелось в виду.
Двачую
Поведение auto можно сымитировать с помощью вывода типа (в частности, с помощью std::function), так что технически он прав.
Я так полагаю, что размер исходного массива - 2^32 - 1, тип всех чисел в массиве - uint32_t, и нужно найти число из множества uint32_t, которое не входит в изначальный массив. К тому же дают еще 2^30 байт памяти сверху?
Задачка для даунов.
Алсо, где таких даунов набирают?
Отсортировать массив, найти два последовательных элементов массива, у которых разница > 1. Вернуть значение между ними. Если такого нет, вернуть элемент меньше минимального или больше максимального - смотря, что вылазит за границы исходного типа.
O(n*logn) по времени, O(1) по памяти
>Побитовый реверс числа
H4XoR неспешно вкатывается, проводя всем по губам.
https://ideone.com/SDXDH5
Тоже думал над этим, но O(n log n), при N = 4e9 это же пиздец. А что если генерировать рандомный int, а потом проверять на его наличие?
Если все элементы различны, то шанс, что рандом не присутствует ~ 7%. Проверка за О(n) и скрытых констант нет, и массив не меняем (может его нельзя менять? в условии ничего не сказано было).
Ты действительно выебываешься выполнением такого простого задания?
Олимпиадники как всегда хуже червей-пидоров: код не читаемый, средств языка не знают, зато самомнения выше крыши.
https://ideone.com/4u9iKm
Время худшего случая с сортировкой - O(32 * n). Время в твоем решении вообще недетерменированно.
Что ты несешь, поехавший? В быстрой сортировке худшее время определено, а статистические методы используются только для выбора опорного элемента, чтобы смягчить худший случай.
>Поведение auto можно сымитировать с помощью вывода типа
auto это и есть вывод типа
> с помощью std::function
std::function это не вывод типа, это type erasure
Твой вариант вообще неправильный. Можно еще шаманов спрашивать, какого элемента в массиве нет - результат будет тот же.
И кстати: вероятность, что рандомного элемента нет в массиве, в худшем случае будет составлять 2^(-32)
prog.cpp: In function 'int main()':
prog.cpp:30:2: error: expected '(' before '{' token
{
^
prog.cpp:31:3: error: 'pushad' was not declared in this scope
pushad
^
В голос с ксакепа.
auto - это одно из двух мест, где применяется вывод типа. Второе место - шаблоны. Так что auto всегда можно выразить через шаблоны.
>std::function это не вывод типа, это type erasure
Выебнулся, молодец. Только там все равно используется вывод типа.
>И кстати: вероятность, что рандомного элемента нет в массиве, в худшем случае будет составлять 2^(-32)
Нит
Берёшь cryptopp, botan или ещё чего. Смотришь. Реализовываешь.
Поцаны, какой поставить свжий компилятор, и как? Под шиндоус, дайте ссыль на мануал попроще
Вопрос: зачем дублировать указатели на объект?
Предвидя "ко-ко-ко, контрольная структура ещё хранит указатель ни деструктор" и "ко-ко-ко, ещё может хранить сам объект в контрольной структуре": вопрос в том, зачем дублировать указатель на объект, а не в этом.
1.Освоил курс сишечки, напару с к&р, поэтому в байтоебстве что-то понимаю.
2.Прочитал [spoler]страуструпа, что же еще[/spoiler], и александреску.
3.Немного освоил (буквально чуть) 11 стандарт, побаловался с лямбдами, и авто, всякие шаредпоинтеры и до этого из буста юзал.
4.Всякую банальщину по вопросам уровня "зачем нужен виртуальный деструктор" в 90% случаев ответить смогу.
5.Есть репозиторий (не на гитхабе, правда) с моими поделками, за код как для новичка не стыдно. Здесь палить не буду, ибо диванон-легивон.
Теперь вопрос: этого багажа достаточно, чтобы околачивать HR-ов по объявам на джуниоров? Или я где-то проебался? Заранее спасибо, ананасы.
Типичный тупой быдлостудент рашковуза.
собирал электронные схемы по книге Кибернетика из говна и палок в 10 лет, в 13 лет читал ксакеп, изучал SQL, брутил аськи и решал задачи из K&R
Алсо,
>чистый си
>байтоебство
смех_2_сезон.mkv
Клиент подключается к этому пайпу (по имени), и в зависимости от ответов сервера выводит то или иное. Так вот, пока я настроил сервер на ответы в 1 (дефолт).
Вся хуйня в том, что пайп проджолжает общаться с клиентом по алгоритму сервера, даже когда сервер перестал работать, даже когда я удалил экзешник, все равно клиент получает сообщения от пайпа, те же самые что я и прописал. Как это может быть?
>>795721
Ну у тебя прям 11/10 блядь достоинства, охуеть вообще. Первые свои костыли я тоже еще в началке на делфи 6 сверстал, с гуем и шлюхами. Мне это HR-у говорить? Или что я на античате примерно в том же возрасте спамеры/реггеры/чекеры толкал? Нашел чем выебнуться блядь. И если сишечка не байтоебство, то где надо канонично байты ебать? В 86 асме? Охуеть вообще.
Даже после рестарта компа, удаленияперемещения исходников все равно клиент получает от этого пайпа те же самые данные. ЧЗНХЙ?
> Мне это HR-у говорить?
Лучше показывай свою коммуникабельность и готовность прогибаться qw/ адекватность/. Айчарихи вон пишут, что типичный программистишка не может понять женщину и заботиться о ней, поэтому они живут с программистишками ради денег или вообще выбирают манагеров. Демонстрируй харизму, двигай тазом, показывай, что ты НАСТОЯЩИЙ МУЖЧИНА. А мы будем дальше дома сидеть.
CallNamedPipe(L"\\\\.\\pipe\\serverpipe",
(LPVOID)bufferIn, 4,
(LPVOID)bufferOut, 1, pBytesRead, 20000);
И таких строчек около 4х, причем после КАЖДОГО вызова в баффер пишется 1.
Это же синхронная фунция, значит, пайп которого вообще не должно существовать получает по 1 байту каждый вызов, где в клиенте может быть проблема?
ок попробую, спасибо)
Ну очевидно же. Разыменование делается обычно на порядок чаще, чем какие-то изменения, требующие доступа к управляющей структуре. Предположим, мы делаем только один указатель на объект. Если он будет только в управляющей структуре, то доступ замедляется сразу в джва раза из-за косвенности, а хотелось бы, чтобы скорость была как для грязных указателей. Если же оставить указатель на объект только в самом shared, то из управляющей структуры не будет видно, что там за объект, это дополнительно усложнит процесс удаления (придется вместе с запросом на декремент счетчика предлагать управляющей структуре в большинстве случаев не нужный указатель на объект, или делать коллбэки, или еще хуй пойми что). Вот и было принято довольно логичное решение пожертвовать несколькими байтами, тем более, что без оверхеда по памяти тут все равно не обойтись, пусть хоть по скорости будет как грязный. Такие дела.
Как там в 2012?
Ну он-то не идет ни в какое сравнение с codelite по стабильности работы из коробки. codelite вообще не работает из коробки, лол.
>Если же оставить указатель на объект только в самом shared, то из управляющей структуры не будет видно, что там за объект
Доступ к управляющей структуре идёт через share_ptr, так что никаких проблем с получением указателя на объект нет.
Без пруфов ты хуй простой, няша. Кококок виртуальность? Это уже вторично, в случае малейшего выигрыша по производительности могли бы сделать мономорфный shared с прямыми специализациями для дефолтных делетеров, всем поебать на архитектурку при реализации быстрых библиотек.
Решение об удалении-то ref_count_base принимает, из нее нужно видеть.
Выброси комп из окна, тогда все норм будет
Жил-был АНДРЕЙ АЛЕКСАНДРЕСКУ. У АНДРЕЯ всё всегда было через ЖОПУ. Мать АНДРЕЯ была наркоманкой. Список ее психических расстройств, венерических заболеваний и наркотиков, на которых она сидела, был длиннее типичного ресторанного меню. Когда пришло время рожать, каково-же было удивление врачей, когда АНДРЕЙ вылез из ЖОПЫ и каким-то образом умудрился убить и частично съесть двух медсестер. АНДРЕЙ был трудным ребенком. Когда АНДРЕЙ еще находился на лечении, на пятнадцатом году шоковой терапии и после второй лоботомии, он вдруг направил свое внимание на языки программирования. Большую часть дня, АНДРЕЙ бился головой о стену, пытался откусить кусок своего тела и ел свои экскременты. Но в перерывах между приступами, АНДРЕЙ листал книги и искал... Он прочитал про десятки языков программирования, но они не вызывали у него никакого интереса, потому что, они не были достаточно извращенными для его тонкого вкуса. Внезапно АНДРЕЙ увидел ВЫЧИСЛЕНИЕ ЧИСЕЛ ФИБОНАЧЧИ ВО ВРЕМЯ КОМПИЛЯЦИИ НА C++ и замер. В его уставшей, больной голове что-то щелкнуло - он нашел, что искал. Он начал читать книги по C++. Чем дальше он проникал в тайны C++, тем больше он понимал, что этот язык создан для него. Мерзкие извращения, которые он наблюдал на страницах, глубоко резонировали с его истерзанной и едко ненавидящей все светлое душой. Его глаза наливались кровью от удовольствия и слезы текли по щекам, от осознания, что на свете есть люди, не намного менее больные, чем он. АНДРЕЙ понимал, что скоро ему сделают третью лоботомию и тогда он вряд ли сможет написать книгу. Времени до третьей лоботомии оставалось немного и АНДРЕЙ решил начать писать книгу прямо сейчас. "THE TIME IS NOW, ANDREI", сказал он вслух самому себе на ломаном английском с выблядски кривым акцентом и начал писать. Вначале он не знал, в чем суть того, что он пишет. Но со временем картина стала ясной как день. АНДРЕЙ взял самый гнилой, уродский и омерзительный язык программирования и решил довести его до уровня сумасшествия, до сих пор невиданного в мире людей. Первый (и последний) технический рецензент его книги, сошел с ума и убил всю свою семью, после прочтения нескольких глав. Узнав об этом АНДРЕЙ смеялся, пока не потерял сознание. АНДРЕЙ понимал, что все идет как надо. Сразу после того, как он дописал последнюю главу, ему сделали последнюю лоботомию и писать книги ему больше не хотелось. Представители издателя взяли книгу АНДРЕЯ и, согласившись ее издать, спросили у него, как бы он хотел ее назвать. На ломаном, кривом английском он ответил: "MODERN C++ DESIGN: GENERIC PROGRAMMING AND DESIGN PATTERNS APPLIED BY ANDREI ALEXANDRESCU". Его акцент был настолько уебищен, что представители издателя начали ржать, с такой силой, что моча начала струиться по их ногам. Но, слишком поздно они поняли, что это была моча АНДРЕЯ. Они не знали, что таким образом он помечает своих жертв, перед тем, как их убить. АНДРЕЙ успел убить одного, но другому удалось спастись, хоть он и лишился уха.
Через несколько лет АНДРЕЯ выпустили. 20 лет шоковой терапии и 3 лоботомии, все-таки, смогли немного успокоить его. Он, конечно продолжал убивать, но редко, и в основном мелких грызунов.
Наступил обычный, скучный день. Скучным он мог быть для кого угодно, но не для АНДРЕЯ. Ведь у него диагностировали шизофрению еще на внутриутробной стадии. Книга продавалась не особо хорошо. В мире оказалось не так уж много запредельно больных людей, готовых ее купить. Уже 2 месяца у АНДРЕЯ почти не было денег и он ел блюдо собственного изобретения - ТУАЛЕТНАЯ БУМАГА ПО ФЛОТСКИ. Блюдо представляло собой собачий корм с вареной туалетной бумагой. Роялти с продаж книги капали ему на банковский счет, но очень вяло. АНДРЕЙ уже отошел от третьей лоботомии и решил взять дело в свои руки. Он положил в сумку с десяток экземпляров MODERN C++ DESIGN и пошел на улицу, с надеждой продать хотя бы несколько. Хотя бы один. Если это удастся, то наконец можно будет купить КЕТЧУП. Подумав о КЕТЧУПЕ, АНДРЕЙ улыбнулся, но повернувшись, чтобы открыть дверь, увидел свое отражение в зеркале. Выражение лица, которое получилось из за улыбки, было настолько ужасающим, что АНДРЕЙ отшатнулся. Он вышел на улицу и стал бродить по улицам. АНДРЕЙ увидел здание, в котором было множество компаний по разработке программ и направился к нему. Там АНДРЕЯ уже знали и вызвали охрану раньше, чем он успел войти. АНДРЕЙ удивился, потому что он никогда не был здесь. Из здания вышел человек и сказал АНДРЕЮ, чтобы он убирался. Человек объяснил, что однажды, один из программистов, работавших в здании, купил себе MODERN C++ DESIGN и принес на работу. Прочитав 5 страниц, этот человек обезумел и успел убить трех коллег, до того как натолкал себе в жопу скрепок и повесился в полностью пустом помещении. После этого, запятнанную кровью книгу, подобрал другой разработчик и цепь событий повторилась. Как вирус, книга распространялась по всему зданию. В результате этой бойни, 30 человек погибли ужасными смертями, перед тем, как кто-то сообразил, что нужно уничтожить книгу. АНДРЕЙ понял, почему его не хотят пускать, но решил попытать судьбу и все-же проникнуть в здание. С раззадоренным еблом, он попытался пробежать в дверь, но охранник ударил его дубиной по еблу, выбив несколько зубов, после чего добил по яйцам, пнув достаточно много раз, чтобы наблюдающие сбились со счета. АНДРЕЙ сполз с крыльца и потерял сознание.
Очнулся он уже под вечер. Первый опыт продажи был не очень удачен, но может во второй раз повезет? АНДРЕЙ шел по улице, страстно разговаривая сам с собой и вдруг увидел двух человек. Подсознательно он узнал их, но не мог вспомнить. Трясясь от страха он подошел к ним и предложил купить книгу. ПОЛ ГРЭМ и ПИТЕР НОРВИГ взяли его книгу и стали листать. Они поняли, с кем они имеют дело. АНДРЕЙ смотрел куда-то в сторону и незаметил первого удара, который пришелся по голове. АНДРЕЙ даже в начале не понял, что происходит, потому что били его как никогда сильно. Удары сыпались со всех сторон и, услышав хруст своих ребер, АНДРЕЙ осознал, что вероятно, живым ему не уйти. Это осознание ввергло его в истерику, но он ничего не мог поделать, кроме того, как обосраться и изваляться в собственном говне. Увидев это ПОЛ ГРЭМ и ПИТЕР НОРВИГ побрезговали добивать жалкого РУМЫНСКОГО барана и оставили его в покое. Грязно выругавшись, АНДРЕЙ поднялся и пошел по улице. Завернув за угол, он увидел СТРАУСТРУПА, стоящего на одном месте и напряженно о чем-то думающего. АНДРЕЙ осмотрелся, но не обнаружив потенциальных покупателей, развернулся и пошел домой, насвистывая РУМЫНСКУЮ НАРОДНУЮ ПЕСНЮ.
Жил-был АНДРЕЙ АЛЕКСАНДРЕСКУ. У АНДРЕЯ всё всегда было через ЖОПУ. Мать АНДРЕЯ была наркоманкой. Список ее психических расстройств, венерических заболеваний и наркотиков, на которых она сидела, был длиннее типичного ресторанного меню. Когда пришло время рожать, каково-же было удивление врачей, когда АНДРЕЙ вылез из ЖОПЫ и каким-то образом умудрился убить и частично съесть двух медсестер. АНДРЕЙ был трудным ребенком. Когда АНДРЕЙ еще находился на лечении, на пятнадцатом году шоковой терапии и после второй лоботомии, он вдруг направил свое внимание на языки программирования. Большую часть дня, АНДРЕЙ бился головой о стену, пытался откусить кусок своего тела и ел свои экскременты. Но в перерывах между приступами, АНДРЕЙ листал книги и искал... Он прочитал про десятки языков программирования, но они не вызывали у него никакого интереса, потому что, они не были достаточно извращенными для его тонкого вкуса. Внезапно АНДРЕЙ увидел ВЫЧИСЛЕНИЕ ЧИСЕЛ ФИБОНАЧЧИ ВО ВРЕМЯ КОМПИЛЯЦИИ НА C++ и замер. В его уставшей, больной голове что-то щелкнуло - он нашел, что искал. Он начал читать книги по C++. Чем дальше он проникал в тайны C++, тем больше он понимал, что этот язык создан для него. Мерзкие извращения, которые он наблюдал на страницах, глубоко резонировали с его истерзанной и едко ненавидящей все светлое душой. Его глаза наливались кровью от удовольствия и слезы текли по щекам, от осознания, что на свете есть люди, не намного менее больные, чем он. АНДРЕЙ понимал, что скоро ему сделают третью лоботомию и тогда он вряд ли сможет написать книгу. Времени до третьей лоботомии оставалось немного и АНДРЕЙ решил начать писать книгу прямо сейчас. "THE TIME IS NOW, ANDREI", сказал он вслух самому себе на ломаном английском с выблядски кривым акцентом и начал писать. Вначале он не знал, в чем суть того, что он пишет. Но со временем картина стала ясной как день. АНДРЕЙ взял самый гнилой, уродский и омерзительный язык программирования и решил довести его до уровня сумасшествия, до сих пор невиданного в мире людей. Первый (и последний) технический рецензент его книги, сошел с ума и убил всю свою семью, после прочтения нескольких глав. Узнав об этом АНДРЕЙ смеялся, пока не потерял сознание. АНДРЕЙ понимал, что все идет как надо. Сразу после того, как он дописал последнюю главу, ему сделали последнюю лоботомию и писать книги ему больше не хотелось. Представители издателя взяли книгу АНДРЕЯ и, согласившись ее издать, спросили у него, как бы он хотел ее назвать. На ломаном, кривом английском он ответил: "MODERN C++ DESIGN: GENERIC PROGRAMMING AND DESIGN PATTERNS APPLIED BY ANDREI ALEXANDRESCU". Его акцент был настолько уебищен, что представители издателя начали ржать, с такой силой, что моча начала струиться по их ногам. Но, слишком поздно они поняли, что это была моча АНДРЕЯ. Они не знали, что таким образом он помечает своих жертв, перед тем, как их убить. АНДРЕЙ успел убить одного, но другому удалось спастись, хоть он и лишился уха.
Через несколько лет АНДРЕЯ выпустили. 20 лет шоковой терапии и 3 лоботомии, все-таки, смогли немного успокоить его. Он, конечно продолжал убивать, но редко, и в основном мелких грызунов.
Наступил обычный, скучный день. Скучным он мог быть для кого угодно, но не для АНДРЕЯ. Ведь у него диагностировали шизофрению еще на внутриутробной стадии. Книга продавалась не особо хорошо. В мире оказалось не так уж много запредельно больных людей, готовых ее купить. Уже 2 месяца у АНДРЕЯ почти не было денег и он ел блюдо собственного изобретения - ТУАЛЕТНАЯ БУМАГА ПО ФЛОТСКИ. Блюдо представляло собой собачий корм с вареной туалетной бумагой. Роялти с продаж книги капали ему на банковский счет, но очень вяло. АНДРЕЙ уже отошел от третьей лоботомии и решил взять дело в свои руки. Он положил в сумку с десяток экземпляров MODERN C++ DESIGN и пошел на улицу, с надеждой продать хотя бы несколько. Хотя бы один. Если это удастся, то наконец можно будет купить КЕТЧУП. Подумав о КЕТЧУПЕ, АНДРЕЙ улыбнулся, но повернувшись, чтобы открыть дверь, увидел свое отражение в зеркале. Выражение лица, которое получилось из за улыбки, было настолько ужасающим, что АНДРЕЙ отшатнулся. Он вышел на улицу и стал бродить по улицам. АНДРЕЙ увидел здание, в котором было множество компаний по разработке программ и направился к нему. Там АНДРЕЯ уже знали и вызвали охрану раньше, чем он успел войти. АНДРЕЙ удивился, потому что он никогда не был здесь. Из здания вышел человек и сказал АНДРЕЮ, чтобы он убирался. Человек объяснил, что однажды, один из программистов, работавших в здании, купил себе MODERN C++ DESIGN и принес на работу. Прочитав 5 страниц, этот человек обезумел и успел убить трех коллег, до того как натолкал себе в жопу скрепок и повесился в полностью пустом помещении. После этого, запятнанную кровью книгу, подобрал другой разработчик и цепь событий повторилась. Как вирус, книга распространялась по всему зданию. В результате этой бойни, 30 человек погибли ужасными смертями, перед тем, как кто-то сообразил, что нужно уничтожить книгу. АНДРЕЙ понял, почему его не хотят пускать, но решил попытать судьбу и все-же проникнуть в здание. С раззадоренным еблом, он попытался пробежать в дверь, но охранник ударил его дубиной по еблу, выбив несколько зубов, после чего добил по яйцам, пнув достаточно много раз, чтобы наблюдающие сбились со счета. АНДРЕЙ сполз с крыльца и потерял сознание.
Очнулся он уже под вечер. Первый опыт продажи был не очень удачен, но может во второй раз повезет? АНДРЕЙ шел по улице, страстно разговаривая сам с собой и вдруг увидел двух человек. Подсознательно он узнал их, но не мог вспомнить. Трясясь от страха он подошел к ним и предложил купить книгу. ПОЛ ГРЭМ и ПИТЕР НОРВИГ взяли его книгу и стали листать. Они поняли, с кем они имеют дело. АНДРЕЙ смотрел куда-то в сторону и незаметил первого удара, который пришелся по голове. АНДРЕЙ даже в начале не понял, что происходит, потому что били его как никогда сильно. Удары сыпались со всех сторон и, услышав хруст своих ребер, АНДРЕЙ осознал, что вероятно, живым ему не уйти. Это осознание ввергло его в истерику, но он ничего не мог поделать, кроме того, как обосраться и изваляться в собственном говне. Увидев это ПОЛ ГРЭМ и ПИТЕР НОРВИГ побрезговали добивать жалкого РУМЫНСКОГО барана и оставили его в покое. Грязно выругавшись, АНДРЕЙ поднялся и пошел по улице. Завернув за угол, он увидел СТРАУСТРУПА, стоящего на одном месте и напряженно о чем-то думающего. АНДРЕЙ осмотрелся, но не обнаружив потенциальных покупателей, развернулся и пошел домой, насвистывая РУМЫНСКУЮ НАРОДНУЮ ПЕСНЮ.
Алсо, про Степанова:
http://steps3d.narod.ru/tutorials/c-minus-minus.html
> Не так давно я узнал, когда именно г-ну Степанову пришла идея библиотеки STL - когда он находился в отделении интенсивной терапии (после отравления рыбой) в, как он сам написал, "delirium state", по-просту - в состоянии БРЕДА.
> Этот малеьнкий фактик очень удачно вписался в мои собственные представления об STL и самом языка С++.
> Даже по сравнению с Java С++ явно в проигрыше - нет интерфейсов (зато есть множественное наследование со всеми его проблемами), объектная модель просто отсутствует.
классика
Только вот как понимать ОО - я не думаю, что программисты, пишущие на Smalltalk'е, сочтут С++ объектно- ориентированным языком. Даже по сравнению с Java С++ явно в проигрыше - нет интерфейсов (зато есть множественное наследование со всеми его проблемами), объектная модель просто отсутствует.
Понятие метаинформации (а также reflection, introspection и т.п.) в С++ отсутствует полностью (а вся среда Smalltalk построена на ней).
Много ли Вы знаете простых и удобных persistence-библиотек для С++, которые бы сами могли сериализовать произвольные объекты ? Максимум, что есть, это сложные библиотек с кучей ограничений и необходимостью вручную (зачастую при помощи макросов) задавать фактически часть метаинформации.
А вот в Smalltalk'е или в Python'е таких библиотек полно.
А как дела у С++ с интеграцией со скриптовыми языками - Perl, Python, Tcl, Ruby и др ? Опять же очень плохо - надо ручками задавать всю необходимую метаинформацию. Есть правда генераторы интерфейсов, которые разбирают Ваш исходный код на С++ и по нему строят необходимые описания.
Только это не всегда работает и почему это не может делать сам компилятор.
А вот Python умеет легко работать даже с такой кривой объектной моделью как СОМ, умеет сериализовать произвольные объекты, умеет на ходу добавлять объекту новые методы.
И все эти "Концепции ООП" появлялись именно таким способом: вот интересный (и дешевый в реализации) эффект — как мы можем его использовать? Началось все с того, что понадобилось придумать новый (быстрый) способ передачи параметров в процедуры. Стандартные алголовские способы: по значению и по имени были медленными по разным причинам. Тогда Хоар изобрел ссылки и null. Раз уж структурная эквивалентность оказалось сложной в реализации, сравнивать стали адреса, по которым "объекты" располагаются — появилось identity. Обратили внимание на то, что блок памяти B, структурированный в начале так же, как и блок A можно обрабатывать процедурами, написанными для работы с A — появился "префиксинг" (даже синтаксически объявление класса родителя было префиксным), под который потом подвели идеологию и назвали "наследованием" (ну и понятно, почему сначала никаких "множественных наследований" не было — что такое "множественный префиксинг"?). К рекордам добавили процедуры, диспетчеризующиеся по одному аргументу. Почему именно по одному? Потому что по n > 1 — сложно в реализации.
Прекрасно решили свои задачи дискретно-событийного моделирования, на тех компьютерах что у них были, и успокоились. Но пришел Алан Кей и все испортил. Кей и прочие смолтокеры захотели сделать не такой вот "натянутый" на структурное программирование ООП, а идеологически чистый и непротиворечивый. Для этого они подвели базу под все эти технические срезания углов. Получилась чистая реализация идей, придуманных для быстроты и простоты реализации, только медленная и сложная. Они не смогли все это заставить вертеться с приемлемой скоростью до 90-х годов, когда стало уже поздно. Чтоб ввести Симула-лайк ООП в мейнстрим понадобилось только (временно) отказаться от сборщика мусора. Однако, вся философия и методология ООП, паттерны и юнит-тесты и т.д., придуманные смолтокерами не пропали, а были адаптированы мейнстримом.
Смолток — это не "изначальное древнее ООП", а возрождение умирающего старого и реформация неправильного ООП, загнувшееся, правда, раньше нем неправильное, пока по настоящему древнее ООП все продолжало умирать. Ну и, понятно, философия ООП, которая превратила все картины, загораживающие дырки на обоях, в "краеугольные камни" концепции и "имманентные особенности человеческого мЫшленья".
И все эти "Концепции ООП" появлялись именно таким способом: вот интересный (и дешевый в реализации) эффект — как мы можем его использовать? Началось все с того, что понадобилось придумать новый (быстрый) способ передачи параметров в процедуры. Стандартные алголовские способы: по значению и по имени были медленными по разным причинам. Тогда Хоар изобрел ссылки и null. Раз уж структурная эквивалентность оказалось сложной в реализации, сравнивать стали адреса, по которым "объекты" располагаются — появилось identity. Обратили внимание на то, что блок памяти B, структурированный в начале так же, как и блок A можно обрабатывать процедурами, написанными для работы с A — появился "префиксинг" (даже синтаксически объявление класса родителя было префиксным), под который потом подвели идеологию и назвали "наследованием" (ну и понятно, почему сначала никаких "множественных наследований" не было — что такое "множественный префиксинг"?). К рекордам добавили процедуры, диспетчеризующиеся по одному аргументу. Почему именно по одному? Потому что по n > 1 — сложно в реализации.
Прекрасно решили свои задачи дискретно-событийного моделирования, на тех компьютерах что у них были, и успокоились. Но пришел Алан Кей и все испортил. Кей и прочие смолтокеры захотели сделать не такой вот "натянутый" на структурное программирование ООП, а идеологически чистый и непротиворечивый. Для этого они подвели базу под все эти технические срезания углов. Получилась чистая реализация идей, придуманных для быстроты и простоты реализации, только медленная и сложная. Они не смогли все это заставить вертеться с приемлемой скоростью до 90-х годов, когда стало уже поздно. Чтоб ввести Симула-лайк ООП в мейнстрим понадобилось только (временно) отказаться от сборщика мусора. Однако, вся философия и методология ООП, паттерны и юнит-тесты и т.д., придуманные смолтокерами не пропали, а были адаптированы мейнстримом.
Смолток — это не "изначальное древнее ООП", а возрождение умирающего старого и реформация неправильного ООП, загнувшееся, правда, раньше нем неправильное, пока по настоящему древнее ООП все продолжало умирать. Ну и, понятно, философия ООП, которая превратила все картины, загораживающие дырки на обоях, в "краеугольные камни" концепции и "имманентные особенности человеческого мЫшленья".
Все это конечно очень интересно, но таки где ORM на крестах? Вот на Java есть Hibernate, на C# - тот же Hibernate и Entity Framework, на скриптовых языках свои ORM... А на крестах что у нас?
Или там сериализация/десериализация XML и JSON, как это можно сделать?
Указатель в control structure нужен для weak_ptr. В shared дублируется, чтобы в control structure лишний раз не лазить. Там два атомика же, если из другого потока будут копию делать/уничтожать пойдёт синхронизация кешей процессора скорее всего, а это долго.
Плюс control structure хуй знает где лежит ещё, может страницу памяти подключать придётся, а может она в свопе уже. А указатель в shared - вот он, тут, либо на стеке, либо и нак на активной странице памяти.
>Указатель в control structure нужен для weak_ptr.
weak_ptr создаётся от shared_ptr и может достать указатель из него же и сохранить так же, в себе, и не лазать в control structure.
Соображения производительности, конечно, играют рояль, но только там, где один поинтер лежит в самом shared/weak ptr. Могли бы лежать два поинтера в control structure. Но их всё равно нужно было два. Иначе не получится зделать shared_ptr, удовлетворяющий стандарту.
Вот я и спрашиваю, зачем ДВА поинтера, неважно, где они лежат.
Дело не в производительности.
Неужели тут нет экспертов?
Предлагают в одной говно-конторке работать на нем за еду
Постепенно переписывал, переписывал и в результате там от исходного вида не осталось ничего общего, кроме #include'ов. Могу ли я такой файл выложить в сеть под свободной лицензией? Можно ли мне его выкладывать вместе с историей правок или сделать так, как-будто это первый коммит?
Во-первых, если нельзя будет понять, что твой код основан на коде либы, то похуй. Если можно, то нужно знать исходную лицензию. Если она не указана, то ЕМНИП она - creative common.
http://pastebin.com/agcYEiij
Нет, все дело в производительности. Вот тебе выступление разработчика STL в MSVC:
https://channel9.msdn.com/Events/GoingNative/GoingNative-2012/STL11-Magic-Secrets
Начинается с 10:30
Реализация, где было бы рядом два одинаковых поинтера - это нонсенс и идиотизм. Если есть два абсолютно одинаковых однотипных поинтера, лежащие рядом, то нет никаких причин, мешающих объединить их в один. Чисто теоретически можно было бы допустить какие-то хитрые изъебства, связанные с кэшированием и подобной хуйней, но это именно что вопрос производительности, не имеющий никакого отношения к стандарту. А ты втираешь какую-то дичь нам и прикрываешься кукареками про икспертов. Эксперт это, блядь, не тот, кто высосал из пальца дрочильню и объявил ее сакральным знанием на основании того, что подобный бред просто не придет в голову никому.
>weak_ptr создаётся от shared_ptr и может достать указатель из него же и сохранить так же, в себе
Не может. Суть weak_ptr в том, что он кроме разрыва циклических ссылок еще и предохраняет от dangling pointers. То есть объект, на который ссылались shared_ptr может быть уже убит, но control structure живет до тех пор, пока на нее указывает хоть один weak_ptr. Когда же weak_ptr пытается получить ссылку на убитый объект, он получает нулевой указатель, вместо указателя на порченную память.
>weak_ptr создаётся от shared_ptr и может достать указатель из него же и сохранить так же
При создании да. А вот при уничтожении или создании shared из weak нет, нужен указатель, а у weak есть полько поинтер на структуру.
В производительности дело же.
Указатель в структуре по идее лишний, т.к. там атомики впритык, значит туда лазить может быть медленно. Но он нужен, чтобы из weak shared делать. Не было бы weak указателей - было бы по одному указателю в shared и всё.
>Может кто-нибудь пояснить за c++ builder ?
>Предлагают в одной говно-конторке работать на нем за еду
На Турбо Паскале за еду не предлагают кодить? О чём вопрос то? За builder, имхо, доплачивать должны, меньше чем за 120к в Россиюшке я бы его даже трогать не стал.
>>796719
>>796764
>>797001
>>797008
"иксперты" застряли в своём манямирке и всё пытаются убедить меня (точнее, себя) что дело только в производительности.
Ладно, вот вам ответ: shared_ptr может указывать на один объект, а управлять временем жизни другого. Поинтер, которым он управляет, лежит в структуре, а который он возвращает по get() или к которому обращается из оператора -> — в самом shared_ptr-е.
Зачем это нужно? Обычно приводят пример, что shared_ptr может хранить указатель на метод объекта, которым управляет. Или можно хранить указатель, полученный кастом управляемого объекта. Ведь поинтер после каста может отличаться, а освобождать объект по поинтеру, по которому ничего не выделялось нельзя.
Короче, см. (8)-й — aliasing — конструктор тут http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr
Перетасуй инклюды, делай одним коммитом и со спокойной совестью считай, что всё написал сам.
Блядь, да вы заебали.
Потрать 2 часа времени и напиши свой shared без weak поинтеров. У тебя поинтеры будут в shared, а в структуре один счётчик. И на касты похуй же, какая тебе в попу разница к чему кастили, виртуальный деструктор должен быть же.
Я в своём манямирке наебался во всеми умными указателями из буста, Qt и std на отлично, не надо тут всех дебилами мнить. Если не до конца понятно что-то - вопрос задай.
Ещё раз, 8 алиасинг ничего не меняет. Ну скастил ты, ну один shared теперь с указателем на базовый. Что поменялось то? Удалит он также хорошо, структура у него такая-же. Да типы указателей в самом shared и структуре разные будут. И чё? Уже сказали тебе, что shared указатель для структуры не пользует, он для weak нужен.
> И на касты похуй же, какая тебе в попу разница к чему кастили, виртуальный деструктор должен быть же.
Ок, а с указателями на члены класса как ты предложишь поступать?
Шо? Можешь развернуть свою мысль? На какие такие члены класса? При разыменовании то? Так и хули будут тебе батины члены. В смысле члены базового класса.
Теперь осталось только объяснить, зачем weak_ptr хранит два указателя, гений ты наш на самом деле нет.
Я тебе скинул выступление, МАТЬ ЕГО, РАЗРАБОТЧИКА STL В MICROSOFT, где он говорит, что в первую очередь там два указателя из-за "zero-overhead access", а тебя такое-то ВРЕТИ.
>Теперь осталось только объяснить, зачем weak_ptr хранит два указателя
А ты настолько туп, что не можешь догадаться даже после моего объяснения? Затем же, зачем и shared_ptr: для aliasing-a.
>>797039
> выступление, МАТЬ ЕГО, РАЗРАБОТЧИКА STL В MICROSOFT
> авторитет для меня всё, шевелить мозгами — ничто
Ясно. Я и не спорю, что указатель, к которому shared_ptr обращается, хранится в нём ради производительности. Я говорю: даже если бы вопрос производительности не стоял, если бы aliasing pointer хранился в control structure, указателей там ВСЁ РАВНО БЫЛО БЫ ДВА, БЛЯДЬ. Один — на управляемый объект, который будет уничтожен при обнулении ссылок на него, а второй — который shared/weak_ptr возвращает из operator->()
Хуя. А реально, зачем? Я не готов час этого чувака слушать.
При создании shared один хуй в структуру лезть, а больше ни для чего указатель и не нужен же.
>Один — на управляемый объект, который будет уничтожен при обнулении ссылок на него, а второй — который shared/weak_ptr возвращает из operator->()
Зойчем? Почему один и тот же не пользовать?
>Обычно приводят пример, что shared_ptr может хранить указатель на метод объекта, которым управляет.
ШТОА????!!!!
>Или можно хранить указатель, полученный кастом управляемого объекта.
И похуй, delete и после каста отработает. А если ты его к жопе привёл - ССЗБ.
Ебать мой хуй. Больные ублюдки!
А на меня бочки катили, что я FILE в них пихал с каспомным делитером. Омичи ебучие.
>А на меня бочки катили, что я FILE в них пихал с каспомным делитером.
Тут есть горстка ебанутых фанатиков. FILE им религия запрещает использовать, макросы им религия запрещает использовать… Хуже муслимов.
Не слушай их.
В weak тоже поинтер на объект есть. Так что производительность - это типа сайд-эффект.
> тебе то же самое рассказал
Не увидел ни слова про aliasing.
>>796764
>Не может.
Конечно не может! Главное, на пикрелейтед не смотреть.
Неужели до кого-то дошло.
https://github.com/boostorg/smart_ptr/commit/09c14760632986e4068a059411cae9c89cb84f46
Так-так-так, что тут у нас? Ой, да это же самая первая реализация связки shared_ptr + weak_ptr! Ой, а давайте посмотрим... Вай, да тут же, оказывается, нет aliasing constructor и при этом указатель на объект хранится и в счетчике, и в shared_ptr. Неужели это ты НЕ ПРАВ?
Можешь начинать оправдываться.
Блядь...
Это понятно, не понятно при такой логике нахуа в weak 2 указателя - на структуру и объект. По такой логике указатель на объект надо из структуры доставать только при создании shared из него.
Религия такая вообще скорее добро и в сферическом мире розовых поней это всё верно. Но есть легаси, а там бывает 3 стула - пихнуть FILE в shared, писать свой RAII холдер (нахуа?) или руками освобождать (за что надо руки отрывать и разбивать ими лицо в кровавое месиво).
Отвечу, если прилюдно покаешься и признаешь правоту "икспердов", которые поясняли за оптимизацию.
>В weak тоже поинтер на объект есть. Так что производительность - это типа сайд-эффект.
Там в любом случае два дереференса, по стандарту - сначала получаешь shared_ptr из weak_ptr, потом уже данные.
Дык, о чём и речь. И если речть только о
>сначала получаешь shared_ptr из weak_ptr, потом уже данные
то указатель на объект в weak нах не нужен. Один хер лезем в структуру при создании shared, чтоб и указатель оттуда не взять?
А он есть, зачем он есть? Алясинг.
>Главное, на пикрелейтед не смотреть
Ты сам-то смотрел? Данные уничтожаются, когда счетчик shared_ptr обнуляется, control уничтожается, когда обнуляются weak_ptr. То есть данные могут уже быть уничтожены, но ctrl будет продолжать жить, и возвращать нулевой указатель при lock.
> Данные уничтожаются, когда счетчик shared_ptr обнуляется, control уничтожается, когда обнуляются weak_ptr.
Очень здорово, что ты это знаешь.
Только к чему ты это написал?
>Я не отрицал роль производительности, я спросил, зачем для std:: (не boost::, идиот) необходимо два указателя
КАКИЕ МАНЕВРЫ. Маньке невдомек, что интерфейс std::shared_ptr попал в стандарт напрямую из буста и является его полной копией. И твой ссаный aliasing constructor пришел именно из буста. Конечно, aliasing constructor накладывает ограничение на реализацию shared_ptr, но не будь его, там там все равно было бы двойное хранение указателя.
Потому что изначальная мотивация была - zero overhead.
Я тебе больше скажу, aliasing constructor в таком виде появился именно из-за дублирования указателя на данные во внутренней реализации.
Начинай каяться, мы ждем.
>>797087
Речь о том, что при предложенном вами объяснении в weak должен быть только поинтер на структура, а там второй есть, на объект. Нахуа он в weak?
Человек открывает для себя волшебный мир умных указателей. Вот, поделился своими знаниями so far.
>там там все равно было бы двойное хранение указателя
В shared - да.
В weak - нет.
Подставляй сраку!
Не >>797085 кун
Я >>796719-кун. Признаюсь честно, я не думал про псевдонимный конструктор хотя, конечно, знаю про него, когда обдумывал твои слова, так что ты отчасти прав, и это серьезная причина. Но я все же не уверен, что это важнее производительности, тем более, раз об этом говорит парень из STL-команды. Если бы производительность не играла никакой роли, то неочевидно, что комитет пошел бы на увеличение оверхеда ради этой весьма специфической и редкой фичи. Я не помню, были ли псевдонимные конструкторы в boost::shared, но есть подозрение, что они не планировались с самого начала, а просто удачно вписались в уже существующую реализацию с двумя указателями. Но это все уже, конечно, домыслы, так что энивей спасибо тебе за содержательную дискуссию. Обожаю крестотред как раз за такие споры.
>В weak - нет.
Да ты что, мой милый, почему же здесь так:
https://github.com/boostorg/smart_ptr/blob/09c14760632986e4068a059411cae9c89cb84f46/include/boost/weak_ptr.hpp
Я не >>797012 кун, но тут все правы. Указатель в структуре нужен для weak, в weak нужен для алясинга, в shared нужен для алясинга и производительности. Два зайца одним камнем и всё такое. А если бы не производительность, то да, скорее всего выкинули бы алясинг КЕМ и не тратили память ради редкоиспользуемой фичи.
>Я не помню, были ли псевдонимные конструкторы в boost::shared,
Были
>но есть подозрение, что они не планировались с самого начала,
Да, в 2007: https://github.com/boostorg/smart_ptr/commit/54e12d03fdfec63b4d8ff41991c4e64af6b1b4b4
>а просто удачно вписались в уже существующую реализацию с двумя указателями
Да
>Нахуа он в weak?
Чтобы не делать лишних телодвижений, когда указатель на данные обнулится. Если он нулевой у weak_ptr, тогда можно сражу возвращать невалидный shared_ptr, не лазая в контрольную структуру.
Вот ета лал так лал. Как же указатель обнулится в weak_ptr? Святым духом, что ли?
Может потому что... может...
Не знаю даже...
Может потому что у него есть get() и разыменования, которого НЕТУ БЛЯДЬ В СТАНДАРТЕ И ЭТО ЕДИНСТВЕННАЯ ПРИЧИНА, ПОЧЕМУ ОН ТАМ?
Ой, чё-то я разорался, чтобы это понять надо же было самому глянуть на код, прежде чем ссылку кидать.
На самом деле, указатель изначально появился там копипастом из shared_ptr, а затем удобно вписался в концепцию алиасинга;
Поинт коректный, если объекта нету - он не появится. Сетим указатель на объект в ноль и не лезем больше в структуру. Но почему не пользовать для этого указатель на структуру? Типа, если объекта нет, отцепляем weak от структуры (если мы последние - сносим структуру), сетим указатель в ноль и при попытке лока всегда возвращаем пустой shared. Не?
Ты так говоришь, как будто мы спорим здесь, чтобы смешать с говном друг друга, а не обменяться опытом.
Не доехало, плохо покаялся. Вот ведь мудак, да? Сначала жирно траллировал и поливал говном анонов, которые дело говорили, потом начал маневрировать, а потом оказалось, что он настолько ссыкло, что даже признать свою неправоту не может.
Одно другому не мешает.
>Не доехало, плохо покаялся
Ты по привычке сразу проглотил, поэтому найти не можешь.
> Сначала жирно траллировал и поливал говном анонов
Я спокойно предложил ответит на вопрос. Когда пошли ответы про производительность, я объяснил, что даже если забить на неё, всё равно будут необходимы два указателя. Уточнил вопрос.
А говну вроде тебя везде поливание говном видится. Всё, иди нахуй, долбоёб.
Няш, ну вот если я столь же пафосно расчехлю свой пак gotchas, то 99.9% анонов включая меня самого обосрется, и не по одному пункту, а я смогу злорадствовать. Но бугурт не отменит полезности, каждый узнает что-то новое для себя. Так же и здесь, тебе дали пищу для размышления - разве так важно, в какой форме?
Ссылка сетится один раз при инициализации.
В ссылку нельзя пихнуть nullptr (ну то есть технически можно, но за такое побьют).
Что ещё?
Да, затупил. Вот он >>797114 правильно говорит. Он там нужен для aliased shared_ptr.
>>797120
У shared_ptr есть конструктор, который позволяет ссылаться не на сам объект, а, напрмер, на его члены. Тогда weak_ptr будет указывать не на сам объект, а куда-то еще, но ссылки будут обнуляться у самого объекта.
>У shared_ptr есть конструктор, который позволяет ссылаться не на сам объект, а, напрмер, на его члены.
Я в курсе, я о том, что
>Чтобы не делать лишних телодвижений, когда указатель на данные обнулится
не причина для второго указателя, т.к. для этого можно сделать как я писал.
Нет
Я пока еще не отсортировал пак, хотел в следующих тредах начать вбрасывать понемногу. Скажем, вот для затравки: http://ideone.com/uTBv1S Легальный ли код по стандарту? Если нет, то почему, если да, то что происходит в нем? Если до бамплимита не разделаетесь, то перекатите ссылку в новый тред, будьте няшами, а то меня не будет завтра.
Обожаю задавать этот вопрос экспертам, которые меня собеседуют. Обычно после этого от тебя отстают с виртуальными деструкторами и сортировкой пузырьком и начинается ламповая беседа про любимый язык.
Ссылка это не объект, а указатель объект. Соответственно все несколько сотен утверждений стандарта, верных только для объектов, образуют различия.
А да, еще не математики для указателей, но это я уже загуглил, так что не считается.
>>797149
>>797151
> What is a reference?
> It's an alias for an object - another name by which it can be called. The implementation is frequently identical to that of pointers. But don't think of references as pointers - a reference is the object.
Нахуй идем, победители?
Артикль `a' от `the' отличаешь?
А слово `существительное' от части речи `существительное'?
(не >>797149)
>But don't think of references as pointers - a reference is the object
Сам иди. Имеется в виду, что ссылка - это объект на который она ссылается.
Typeof ссылки вернёт тип этого объекта.
sizeof вернёт размер объекта, а не ссылки.
Попытка взять адрес ссылки вернёт адрес объекта.
Точно лень искать, но примерно в 3.9 перечислены объектные типы, ссылок там нет.
>>797160
>>797164
Ну раз мы любим заковыристые вопросы, так ответьте, почему нельзя взять ссылку на ссылку, если внутри это указатели.
Если это действительно указатели, то тогда должно быть все ок, но оно не ок.
Если ссылка это the объект, то ссылка на ссылку должна вернуть ссылку на объект.
Время пошло.
>почему
По стандарту, маня. Разрешено делать только то, что явно разрешено в стандарте. В стандарте говорится только о ссылках на объектные типы, сами ссылки не являются объектными типами. Поэтому ссылки на ссылки неявно запрещены, как и бесконечное число других невалидных конструкций.
>внутри это указатели
Для кодогенератора в компиляторе - да. Для программиста - нет.
>ссылка на ссылку должна вернуть ссылку на объект
int a;
int& b = a;
int& c = b;
c - ссылка на a. Если b протухнет, c останется валидным.
>ссылка на ссылку должна вернуть ссылку на объект
Так и есть, это явно оговорено. Но возможно только при выводе аргументов шаблона или синонимов, в остальных случаях ты чисто технически не сможешь написать такое, ибо упомянутая ссылка сразу воспринимается как referenced тип.
Вооот, так и сразу говори - потому что по стандарту дяденьки придумали, а не потому что ссылки это the объект.
>>797169
>>797173
>>797173
То же самое можно сказать и про указатель. Просто указатель приходится разыменовывать.
>>797176
Там идет схлопывание ссылочных типов, а не вывод ссылки на ссылку.
>в остальных случаях ты чисто технически не сможешь написать такое
потому что дяденьки сказали, что так нельзя.
>Если ссылка это the объект, то ссылка на ссылку должна вернуть ссылку на объект.
Так и есть http://ideone.com/AVxvWK
struct A
{
int& a;
};
int main()
{
int a1 = 5;
A* aa1 = nullptr;
{
int& b = a1;
aa1 = new A{ b };
}
int d1 = aa1->a;
Работает.
>работает
В спорах о дебрях стандарта это очень слабый аргумент, ибо прямо сейчас в каждом из компиляторов сотни непофикшенных багов. По факту ни один стандарту полностью не соответствует.
>Вооот, так и сразу говори - потому что по стандарту дяденьки придумали, а не потому что ссылки это the объект.
Ссылки по стандарту the object, маня, ты о чём?
Ссылка - не указатель и никоим боком с ним не связана. То что компиляторы генерят похожий код в некоторых случаех говорит тебе только о деталях имплементации компилятора, больше не о чём.
Оно по стандарту должно работать. A.a - это ссылка на а1, к b после инициализации она не имеет никакого отношения.
>Ссылки по стандарту the object, маня, ты о чём?
Я что-то говорю против?
>То что компиляторы генерят похожий код в некоторых случаех говорит тебе только о деталях имплементации компилятора, больше не о чём.
Вот об этом я и говорю. Теоретически, ссылки это не указатели, но фактически - указатели. Поэтому запрет делать ссылки на ссылки и архивы ссылок исходит только из стандарта (т.е. потому что так придумали), а не потому что по факту так нельзя.
Детский пример.
>>Поэтому запрет делать ссылки на ссылки и архивы ссылок исходит только из стандарта (т.е. потому что так придумали), а не потому что по факту так нельзя.
Сам понял, что сказал? А из чего ещё оно может исходить? Если бы в стандарте было написано, что ссылки можно ебать, если им есть 18, то производитель компилятора должет хоть как извернуться, но поебушки обеспечить и будет ссылка не указателем, а тнёй.
От того что указатель под собой имеет просто 64 битное число ты же не думаешь о нём как о простом числе. Это абстракция, ёбана. Поведение её описано в стандарте и никого не должно ебать, как она реализована внизу. Понятно, что знать это хорошо для системного понимания и возможности делать какие-то оптимизации, но по части философии - всё как в джаве: тебе описали поведение, а как уж реализованно - не ебёт.
Что нету ссылки на ссылку. При взятии адреса ссылки даётся адрес объекта.
Хотя адрес у неё где-то там есть, но без грязного хака его не достанешь.
Сам хак: http://ideone.com/hJtNfa
> 5 There shall be no references to references, no arrays of references, and no pointers to references.
>Вот ответ. А не потому что ссылки это не объекты.
Ссылки не объект, поэтому стандарт и запрещает.
> А не потому что ссылки это не объекты.
3 Basic concepts [basic]
3 An entity is a value, object, reference, …
Все с тобой ясно. Весь тред доказывает, что ссылки на ссылки нельзя создать, потому что ссылки это не объект, и тут ему показывают, что ссылку на не-объект можно таки создать по стандарту.
Вот это ты зря. С его способностью следить за нитью обсуждения он сейчас хохлосрач начнёт.
В общем, подведем черту:
>>797144
>Да, но почему? Это следствие.
Потому что это явно не разрешено стандартом.
Создавайте новый тред, этот ушел в бамплимит.
Блядь, потому что она похожа на объект, но не объект. Если бы ссылка по поведению была похожа на функцию, тебе бы доказывали, что адрес на неё нельзя брать, потому что это не функция. Утырок, ты чего к формулировкам докапываешься? Ты действительно не понял, что тебе сказать хотели? Или тебе просто нравиться поебываться до людей пока нахуй не пошлют или пока не начнут определениями из стандарта разговаривать?
Это ты уже перестал понимать тот факт, что ссылки на ссылки нельзя создавать, не связан с тем фактом, что ссылка не объект или похожа на объект.
Вот представь себе стандарт.
Дилдо не острое, можно пихать в жопу.
Нож острый, нельзя пихать в жопу.
Вопрос, почему нельзя пихать нож в жопу? Потому что стандарт или потому что острый?
Технически оба ответа правильные, но мы говорим о втором, потому что ответ ПО СТАНДАРТУ в обсуждении не нуждается, утырок.
Тебе снова повторить ответ?
Ок:
>There shall be no references to references, no arrays of references, and no pointers to references.
Опять же, функция не является объектом, однако ссылку на функцию можно создать.
Ответ про не-объект - неправильный.
И тут ты такой приходишь и говоришь, что язык тоже бывает острый, но его пихать в жопу можно, значит нож нельзя по стандарту, а не потому что острый.
Ты правда думаешь что это строчка из стандарта никак не связана с тем, что ссылка не объект?
То есть твое объяснение это то, что функция как бы объект, а ссылка не объект? Прости, я не умею интерпретировать предложения, которые написаны в припадке.
Сформулируй себя нормально, и может быть я тебя пойму.
>>797247
Дай тут закончить дело, в интернете кто-то неправ, а тащить это в новый тред не хочется.
Функции - это вообще отдельные сущности, которые ни к ссылкам, ни к объектам отношения не имеют.
Прикол с ссылкой в том, что это не объект, как многие думают. То есть изначально такой прикол с ссылкой. Она чем-то похожа на объект, но не объект. Поэтому в стандарте запретили всё что ты перечисляешь. А была бы объектом - скорее всего не запретили бы. Про функции речи не шло вообще, что ты про них вспомнил то?
Функции я приплел к тому, что они одного порядка со ссылками - они тоже не-объекты, но энтити. Твой тезис - нельзя создать ссылки на не-объекты. Этот тезис неверен.
Да ты что? Правда?
http://ideone.com/ULSI5n
Иногда он есть, как в http://ideone.com/hJtNfa
А иногда и нету, если компилятор знает адрес объекта на этапе компиляции (какая-нибудь локальная переменная на стеке) то может и не быть, да.
Как раз в твоём примере у ссылки нету адреса. Нету вообще, нигде. Компилятор выкинул нах b и просто работает с a.
>>797273
Ладно, неправильно выразился, от ссылки тоже можно взять адрес, который будет совпадать с адресом объекта. То есть операция взятия адреса тут тоже не связана с тем, что ссылку на ссылку нельзя создать.
>То есть операция взятия адреса тут тоже не связана с тем, что ссылку на ссылку нельзя создать.
Как это не связана? Потому, в практическом плане, и нельзя что адрес от ссылки - это адрес объекта.
В общем, признай, что ты сам ничего не знаешь, Джон Сноу.
Ссылки на функции возможны, только потому что разрешены стандартом:
>A reference shall be initialized to refer to a valid object or function.
Ссылки на ссылки невозможны, только потому что это не разрешено стандартом. Какого-либо логического объяснения тут нет.
А я пошел.
Я как честный кукаретик не умею ничего делать, даже перекаты.
Мне нужно устанавиливать доп библиотеки или нет?
Когда понадобятся - тогда и накатишь. Особенно учитывая что часто это нетривиальный процесс. Рекоммендую спиратить Visual Assist. Подсветка кода и автодополнение в разы лучше, чем у студии.
Алсо, сам плюнул на VS через пару лет использования и пользую Qt Creator. Qt изкаробки, можно проверять код и MS компилятором и gcc изкаробки (а учитывая, что gcc строже - это таки плюс). Формошлёпка лучше. Если судьба на лялих занесёт для тебя ничего не поменяется.
> vector
> new
Олимпиадник из соседнего треда.
class Foo
{
public:
virtual void foo() = 0;
}
class Bar : public Foo
{
public:
/virtual/ void foo() {}
}
Не обязательно. Раньше считалось хорошим тоном. Сейчас хороший тон - ставить override.
>Подсветка кода и автодополнение в разы лучше
Как там, в 2010? В 15 студии не покрывается ну максимум треть фич ассиста, а тормозит он по-прежнему. Гораздо лучше добить эту треть ортогональными микродополнениями, каждое про одну фичу.
return;
warning: assuming signed overflow does not occur when assuming that (X - c) > X is always false
что за блядство? неужели дожились, что уже нельзя 2 числа одинакового типа сравнить без гемора?
Допустим, у нас есть игра. Коммуникация клиент-сервер идет через свой tcp- или udp-протокол. Как сервер идентифицирует пакеты клиента?
Например, в играх на http и ws к каждому запросу прикрепляется session id. Но как это делается на более низком уровне?
Со времен читерства помню, что в diablo 2 пакеты были чистые и не содержали никакой сессионной информации. А в пакетах lineage 2 и wow было несколько байт, которые постоянно менялись. Что-то вроде ключа, хитро ксорящегося после каждого пакета.
В любом случае сервер должен как-то сопоставлять пакет с сущностью юзера.
Неужели это определяется тупо по сокету? И аттакер мог бы совершать действия за другого юзера, имея его айпи и зная порты?
Можешь глянуть.
https://www.reddit.com/r/programming/comments/4s0gae/doom_3_network_architecture_pdf/
Быстро глянул, там ничего не сказано про безопасность. А по структуре пакета понятно, что ее нет.
Я сейчас вспомнил про ассиметричное шифрование. Но почему тогда оно не было применено в таких крупных играх? Видимо, слишком большой оверхед.
https://ideone.com/6M1Ea0
set<T> mySet;
...
set<T>::iterator iter = mySet.find(elem);
&(*iter) возвращает константный указатель. Че делать то?
говно этот ваш STL, слишком СЛОООЖНАА
Скорее всего нет.
Ну бля, ну че ты обидчивый такой.
хотя я уже все с константными указателями сделал, мне их в принципе менять не надо
Лол, при чём тут обида вообще?
У меня size_t вообще 8-байтовый, лел.
нет, все инты
Привет, крестач.
Решил попытаться освоить кресты, точнее начать уже практическую часть освоения этого языка, но просто встрял на настройке среды как таковой. Я уже, наверное, неделю ебусь с правильной установкой cygwin'а.
Подскажи, анон, как правильно накатить cygwin чтобы netbeans его видел полностью, а то у меня make и debug не вылезают. Гайды пересмотрел, по ним все делал - все тлен. Есть ли альтернативы для писания кода с меньшей степенью ебли при установке?
Он тебе говорит, что если не происходит переполнение, то (X - c) > X всегда false. Может у тебя строкой выше что-то типа index = mSize - 1 и он на index > mSize ругается, как на бессмысленное? Покажи функцию целиком.
Что передать, чтобы считывало с 10го символа?
char parray = new char[1000];
abstract_read(parray, 10);
abstract_read(&array[10], 10); //shit code here
разметка, каждый char - это char *
Ну, по идее, как у тебя. Передавай &array[10] или array + 10, что то же самое.
Поэтому С++ со временем выдавят. На это уйдёт куча времени, но его место займут другие языки. Что забавно, С, думаю, останется сильно дольше - т.к. он гораздо проще.
Осталось только добавить поддержку в Rust'е импорт C headers из коробки. После этого "два крестика" покатится cо всё нарастающей скоростью.
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <Windows.h>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <conio.h>
#include <process.h>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
setlocale(LC_ALL, "ru_RU.UTF-8");
setlocale(LC_ALL, "");
{
typedef unsigned long int uli;
typedef long double ld;
ld num, a, b, c;
uli x, y, z;
main_menu:
cout << "Введите число, соотвествующее командам, представленным ниже:" << endl;
cout << "1. Сложение." << endl;
cout << "2. Вычитание." << endl;
cout << "3. Умножение." << endl;
cout << "4. Деление." << endl;
cout << "0. Выход из программы." << endl;
cin >> num;
if (num == 1) {
cout << "Введите первое слагаемое:" << endl;
cin >> a;
cout << "Введите второе слагаемое:" << endl;
cin >> b;
c = a + b;
cout << "Сумма слагаемых равна: " << c << endl;
goto main_menu;
}
else if (num == 2) {
cout << "Введите число, из которого будем вычитать:" << endl;
cin >> a;
cout << "Введите вычитаемое:" << endl;
cin >> b;
c = a - b;
cout << "Разность равна: " << c << endl;
goto main_menu;
}
else if (num == 3) {
cout << "Введите число, которое будет умножаться:" << endl;
cin >> a;
cout << "Введите число, на которое будет умножаться первое число:" << endl;
cin >> b;
c = a * b;
cout << "Произведение чисел равно: " << c << endl;
goto main_menu;
}
else if (num == 4) {
cout << "Введите число, которое будет делиться:" << endl;
cin >> a;
del:
cout << "Введите число, на которое будет делиться первое число:" << endl;
cin >> b;
if (b = 0) {
cout << "На ноль делить нельзя! Введите второе число заново." << endl;
goto del;
}
else {
c = a / b;
cout << "Деление дало результат: " << c << endl;
goto main_menu;
}
}
else if (num ==0) {
exit(0);
}
else {
cout << "Число введено неправильно! Попробуйте ещё раз." << endl;
goto main_menu;
}
}
system("pause");
return 0;
}
Я сделал всё правильно?
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <Windows.h>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <conio.h>
#include <process.h>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
setlocale(LC_ALL, "ru_RU.UTF-8");
setlocale(LC_ALL, "");
{
typedef unsigned long int uli;
typedef long double ld;
ld num, a, b, c;
uli x, y, z;
main_menu:
cout << "Введите число, соотвествующее командам, представленным ниже:" << endl;
cout << "1. Сложение." << endl;
cout << "2. Вычитание." << endl;
cout << "3. Умножение." << endl;
cout << "4. Деление." << endl;
cout << "0. Выход из программы." << endl;
cin >> num;
if (num == 1) {
cout << "Введите первое слагаемое:" << endl;
cin >> a;
cout << "Введите второе слагаемое:" << endl;
cin >> b;
c = a + b;
cout << "Сумма слагаемых равна: " << c << endl;
goto main_menu;
}
else if (num == 2) {
cout << "Введите число, из которого будем вычитать:" << endl;
cin >> a;
cout << "Введите вычитаемое:" << endl;
cin >> b;
c = a - b;
cout << "Разность равна: " << c << endl;
goto main_menu;
}
else if (num == 3) {
cout << "Введите число, которое будет умножаться:" << endl;
cin >> a;
cout << "Введите число, на которое будет умножаться первое число:" << endl;
cin >> b;
c = a * b;
cout << "Произведение чисел равно: " << c << endl;
goto main_menu;
}
else if (num == 4) {
cout << "Введите число, которое будет делиться:" << endl;
cin >> a;
del:
cout << "Введите число, на которое будет делиться первое число:" << endl;
cin >> b;
if (b = 0) {
cout << "На ноль делить нельзя! Введите второе число заново." << endl;
goto del;
}
else {
c = a / b;
cout << "Деление дало результат: " << c << endl;
goto main_menu;
}
}
else if (num ==0) {
exit(0);
}
else {
cout << "Число введено неправильно! Попробуйте ещё раз." << endl;
goto main_menu;
}
}
system("pause");
return 0;
}
Я сделал всё правильно?
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <Windows.h>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <conio.h>
#include <process.h>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
setlocale(LC_ALL, "ru_RU.UTF-8");
setlocale(LC_ALL, "");
{
typedef unsigned long int uli;
typedef long double ld;
ld num, a, b, c;
uli x, y, z;
main_menu:
cout << "Введите число, соотвествующее командам, представленным ниже:" << endl;
cout << "1. Сложение." << endl;
cout << "2. Вычитание." << endl;
cout << "3. Умножение." << endl;
cout << "4. Деление." << endl;
cout << "0. Выход из программы." << endl;
cin >> num;
if (num == 1) {
cout << "Введите первое слагаемое:" << endl;
cin >> a;
cout << "Введите второе слагаемое:" << endl;
cin >> b;
c = a + b;
cout << "Сумма слагаемых равна: " << c << endl;
goto main_menu;
}
else if (num == 2) {
cout << "Введите число, из которого будем вычитать:" << endl;
cin >> a;
cout << "Введите вычитаемое:" << endl;
cin >> b;
c = a - b;
cout << "Разность равна: " << c << endl;
goto main_menu;
}
else if (num == 3) {
cout << "Введите число, которое будет умножаться:" << endl;
cin >> a;
cout << "Введите число, на которое будет умножаться первое число:" << endl;
cin >> b;
c = a * b;
cout << "Произведение чисел равно: " << c << endl;
goto main_menu;
}
else if (num == 4) {
cout << "Введите число, которое будет делиться:" << endl;
cin >> a;
del:
cout << "Введите число, на которое будет делиться первое число:" << endl;
cin >> b;
if (b = 0) {
cout << "На ноль делить нельзя! Введите второе число заново." << endl;
goto del;
}
else {
c = a / b;
cout << "Деление дало результат: " << c << endl;
goto main_menu;
}
}
else if (num ==0) {
exit(0);
}
else {
cout << "Число введено неправильно! Попробуйте ещё раз." << endl;
goto main_menu;
}
}
system("pause");
return 0;
}
Вот так лучше, ящетаю. Можно было бы и раскинуть всё это по разным функциям, но мне как обычно лень.
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <Windows.h>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <conio.h>
#include <process.h>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
setlocale(LC_ALL, "ru_RU.UTF-8");
setlocale(LC_ALL, "");
{
typedef unsigned long int uli;
typedef long double ld;
ld num, a, b, c;
uli x, y, z;
main_menu:
cout << "Введите число, соотвествующее командам, представленным ниже:" << endl;
cout << "1. Сложение." << endl;
cout << "2. Вычитание." << endl;
cout << "3. Умножение." << endl;
cout << "4. Деление." << endl;
cout << "0. Выход из программы." << endl;
cin >> num;
if (num == 1) {
cout << "Введите первое слагаемое:" << endl;
cin >> a;
cout << "Введите второе слагаемое:" << endl;
cin >> b;
c = a + b;
cout << "Сумма слагаемых равна: " << c << endl;
goto main_menu;
}
else if (num == 2) {
cout << "Введите число, из которого будем вычитать:" << endl;
cin >> a;
cout << "Введите вычитаемое:" << endl;
cin >> b;
c = a - b;
cout << "Разность равна: " << c << endl;
goto main_menu;
}
else if (num == 3) {
cout << "Введите число, которое будет умножаться:" << endl;
cin >> a;
cout << "Введите число, на которое будет умножаться первое число:" << endl;
cin >> b;
c = a * b;
cout << "Произведение чисел равно: " << c << endl;
goto main_menu;
}
else if (num == 4) {
cout << "Введите число, которое будет делиться:" << endl;
cin >> a;
del:
cout << "Введите число, на которое будет делиться первое число:" << endl;
cin >> b;
if (b = 0) {
cout << "На ноль делить нельзя! Введите второе число заново." << endl;
goto del;
}
else {
c = a / b;
cout << "Деление дало результат: " << c << endl;
goto main_menu;
}
}
else if (num ==0) {
exit(0);
}
else {
cout << "Число введено неправильно! Попробуйте ещё раз." << endl;
goto main_menu;
}
}
system("pause");
return 0;
}
Вот так лучше, ящетаю. Можно было бы и раскинуть всё это по разным функциям, но мне как обычно лень.
менеджер зависимостей и сборки хотят прикрутить уже сейчас. В 17 стандарт не вошёл, печаль, но он будет. А Майкрофост уже пилят свой велосипед без стандарта. Rust не взлетит, потому что он по большей части решает те проблемы C++, которые уже не особо актуальны.
Так говорю же, забросил изучение крестов, остановился на массивах и строках в книге Шилдта (там про функции начиналась глава). Вот и решил что-нибудь простенькое для себя написать, чтобы освежить память.
Где можно почитать годный мануал по codelite?
А то что-то я запутался
>Vim/Emacs
Я ньюфаня и я сразу, не дробя, начал хуярить упражнения в терминале, юзая gcc и vim. Собсна, а зачем мне переключаться между окнами, если можно этого не делать? Алсо, в таком случае не понимаю, почему и зачем под LINUX уже успел появиться Visual Studio, причем официальный? Тут ведь своих средств разработки хватает, хуле мелкомягкие сюда лезут?
>>Но ведь C++ и правда умирает
>>Ссылка на страницу по C
Дурак, чтоли? Да и один хер, на 3-м месте после С, чтоб я так умирал.
Это потому что ссылка на C++ преобразуется в ссылку на C. Вот так правильно:
http://www.tiobe.com/tiobe-index/cplusplus/
Господа кодеры, вопрос такой:
существует ли в нашей вселенной книга/гайд/видеокурс/блог/етц, в котором бы не тупо объяснялся синтаксис языка, а в процессе обучения пилился бы некий более менее реальный проект и давались более менее серьезные задачи?
Все "самоучители" следуют одному шаблону:
объяснение синтаксиса - коротенькие примеры кода - опционально еще более короткие задачи для самостоятельного решения.
Я полный нуб в крестах, но чому у тебя там else-if? Не проще ли было реализовать на switch-case?
http://stackoverflow.com/questions/11894124/why-overloaded-operators-cannot-be-defined-as-static-members-of-a-class
Т.е. почему вместо
class A
{
int x;
public:
friend A operator+(const A&, const A&);
};
я не могу использовать
class A
{
int x;
public:
static A operator+(const A&, const A&);
};
и вообще, почему нельзя определять static-операторы?
С английским тяжело, помогите пожалуйста. Что-то я и сам понял, т.е. для второго варианта со static'ом допустимо такое выражение
A x, y, z;
x.operator+(y,z)
тогда да, вообще не ясно что складывать. Но однако черти, по ссылке вверху написали дофига, если ты еще подскажешь мне причины сего факта.
http://stackoverflow.com/questions/11894124/why-overloaded-operators-cannot-be-defined-as-static-members-of-a-class
Т.е. почему вместо
class A
{
int x;
public:
friend A operator+(const A&, const A&);
};
я не могу использовать
class A
{
int x;
public:
static A operator+(const A&, const A&);
};
и вообще, почему нельзя определять static-операторы?
С английским тяжело, помогите пожалуйста. Что-то я и сам понял, т.е. для второго варианта со static'ом допустимо такое выражение
A x, y, z;
x.operator+(y,z)
тогда да, вообще не ясно что складывать. Но однако черти, по ссылке вверху написали дофига, если ты еще подскажешь мне причины сего факта.
Есть функция в длл, и есть функция в другой длл
нужно сделать указатель на функцию используя GetProcAddress
проблема в том, что вот такой вот вид,:
origComputeTgtPosition = (bool ( CEGun::)(Vector& vec)) GetProcAddress(GetModuleHandle(TEXT("Common.dll")), "?ComputeTgtLeadPosition@CEGun@@QBE_NAAVVector@@@Z");
приводит к ошибке
невозможно преобразовать "FARPROC" в "FireResult (__thiscall CEGun:: )(const Vector &)"
Говорили что то про касты, читал про typedef и указатели, но никак не могу применить к этому примеру.
Проще, но я не помню, как пользоваться этой инструкцией.
Ты попробуй порефакторить под Vim/Emacs.
ЧЁПОЧИТАТЬ, чтобы освоить их как технологию, без всяких нравоучений о том, какое сложное устройство этот MP3-плеер и какую важную роль компьютеры играют в нашей жизни?
Просто C++ говно без задач.
А если серьезно, двачую вопрос. Сам сейчас планирую взять один проект на ноджс и переписать часть в виде модулей на крестах.
Иногда один С++ заебывает, хочу почитать для развития что-нибудь про алгоритмы и организацию самих железок. Есть что-нибудь для ньюфагов, но без воды?
Это копия, сохраненная 7 августа 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.