О божья месть, как тяжко устрашен Быть должен тот, кто вскоре прочитает Тот код, что в этом треде был рожден!
Здесь черви, что к крестам любовь питают, Чтят байтоебство мудрости венцом И Бьерна откровениям внимают,
Вновь корчатся в терзанье вековом, Узрев template error'ов рой несметный, И снова компилятор мнят врагом,
Не зная, что все их мученья тщетны.
Литература:
Для нюфань: Три классических учебника для начинающих. Все примерно одинаковой годноты, читать имеет смысл только какой-нибудь один, который больше приглянется. Герберт Шилдт - C++. Базовый курс (2010) - http://goo.gl/qMLAFl Роберт Лафоре - Объектно-ориентированное программирование в C++ (2004) - http://goo.gl/QvjR6x Стивен Прата - Язык программирования C++ (2012) - https://goo.gl/z7kA8u Для желающих сразу начинать с Откровений Создателя - классика (может показаться суховатым): Бьерн Страуструп - Программирование. Принципы и практика использования C++ (2009) - https://goo.gl/87qXtW
Учимся не писать говнокод: Книги про основные подводные камни для тех, кто осилил предыдущий пункт. Следует пролистать все. Скотт Мейерс - Эффективное использование C++ (2005) - https://goo.gl/wsDXGz Скотт Мейерс - Наиболее эффективное использование C++ (1996) - https://goo.gl/tHa0tO Скотт Мейерс - Effective Modern C++ (на ангельском) (2015) - https://goo.gl/uImH0J Скотт Мейерс - Эффективное использование STL (2002) - https://goo.gl/QtS8Dc Герб Саттер и Андрей Александреску - Стандарты программирования на языке C++ (2005) - https://goo.gl/Cpk4YR
Тонкости языка (для гурманов): Андрей Александреску - Современное проектирование на C++ (2002) - https://goo.gl/e1V5BC Герб Саттер - Решение сложных задач на C++ (2002) - https://goo.gl/iWaa6S Герб Саттер - Новые сложные задачи на C++ (2004) - https://goo.gl/4nn512 Также для легкого чтения подойдет книжка c историей создания C++: Бьерн Страуструп - Дизайн и эволюция C++ (1994) - https://goo.gl/FqbPwo
Отдельные аспекты: Читать по необходимости. Энтони Уильямс - Параллельное программирование на C++ в действии (2012) - https://goo.gl/qJfBkD Николаи Джоссатис - C++. Стандартная библиотека (2012) - https://goo.gl/PEyiMH Дэвид Вандевурд, Николаи Джоссатис - Шаблоны C++. Справочник разработчика (2003) - http://goo.gl/0M4NpG
Под шиндошс удобно использовать IDE Microsoft™ Visual Studio®. Базовую версию (2015 Community) можно бесплатно скачать, следуя инструкциям с этой страницы: https://www.visualstudio.com/ru-ru/products/free-developer-offers-vs.aspx. Чтобы начать писать код, нужно запустить Visual Studio, кликнуть "Файл - Создать - Проект - Пустой проект", после создания кликнуть слева правой кнопкой мыши по пункту "Файлы исходного кода", выбрать "Добавить - Создать элемент - Файл C++". Свои хэллоуворлды писать в этот файл, в дальнейшем можно добавить другие файлы и хедеры. Чтобы скомпилировать и запустить проект, нужно нажать "Сборка - Собрать решение", а затем "Отладка - Запуск без отладки".
Под *nix, как правило, уже предустановлен компилятор gcc (если нет, используй sudo aptitude install gcc), так что достаточно сохранить хэллоуворлд, набранный в текстовом редакторе, и выполнить g++ helloworld.cpp и ./a.out. Но удобнее установить какую-нибудь IDE, например, Code::Blocks (sudo aptitude install codeblocks) и работать в ней.
Можно также не устанавливать ничего, а запускать свои хэллоуворлды на http://ideone.com, выбрав в левом нижнем углу язык C++14.
Памятка:
Вопросу по синтаксису идут на хуй. Лабы идут на хуй. "Как мне сделать Х на чистых крестах без библиотек" идут на хуй. Все идут на хуй. Хейтер сосет члены на пару со своей мамашей.
Аноны, а можно сделать, чтобы объект класса создавался автоматически? Примерно как cout. Я же не пишу ostream cout, а сразу начинаю им пользоваться. То есть охота сделать класс с одним статическим объектом. И если подцепляю хедер, то он у меня автоматом создаётся объект. Как такое вообще можно провернуть? Хотя бы примерно.
>>531265 cout это обычная глобальная переменная класса ostream, которая инициализируется до первого обращения к ней. Берешь и создаешь свою такую же, сможешь обратиться к ней отовсюду, где она будет видна.
Если тебе принципиально "автоматическое создание", то тогда непонятно, где ты хочешь, чтобы находился созданный объект. Допустим, ты все сделал, подключил хэдер, как ты дальше получишь единственный автоматически созданный объект класса? Если ты хочешь не получать объект, а использовать только статические методы через A::f (), то тебе и не нужно создавать объект, просто делаешь все методы статическими. А нестатические ты энивей не сможешь так вызвать даже транзитом. Если ты хочешь получить откуда-то ссылку на объект, то воспользуйся паттерном синглтон. Грубо говоря, так:
//Получаем ссылку на объект-мамку. //При первом вызове она будет создана, дальнейшие будут возвращать ссылку на уже созданную TvoyaMamka & mamka = TvoyaMamka::getInstance (); [/code]
>>531275 > Если ты хочешь не получать объект, а использовать только статические методы через A::f (), то тебе и не нужно создавать объект, просто делаешь все методы статическими. Вообще, да, именно статические методы и хотел получить. Просто я почему-то подумал, что вообще без объектов к ним не получится обратиться.
>>531269 Это какая-то дичь, лол. В каждой единице трансляции с таким хэдером будет создана новая копия init с вызовом конструктора. И единственным на всю программу x и y будет многократно присвоены одни и те же значения. Я не говорю уже о том, что если в одном из таких файлов кто-то после определния init попытается записать в x или y в глобальном контексте например, в конструкторе еще одного статического члена, то последствия будут ужасны.
>>531277 9.4.2/3 "A static data member of literal type can be declared in the class definition with the constexpr specifier ... In both these cases, the member may appear in constant expressions". Делается это затем, что "it must be immediately constructed or assigned a value", а для нестатического члена-переменной это может произойти только когда объект будет создаваться.
[code lang="cpp] void foo () { //... { //<- point A int x = 1; //<- point B int y = 2; //<- point C } //... } [/code]
Вопрос к гуру. С точки зрения языка, в точке A не определены ни x, ни y, в точке B определена только x, в точке C определены обе. С точки зрения машинного кода, будет ли в точке B в стеке уже находиться y? Проще говоря, все переменные блока пихаются в стек в начале блока, или по мере определения?
>>531293 Тут не надо быть гуру, чтобы ответить. [code lang=cpp] { int x = y; //Ошибка, потому что y еще не определена (ее нет в стеке) int y = 1; } [/code]
>>531294 Тогда как решать подобные проблемы: [code lang="cpp"] { int x = 1; //Код, который может бросить исключение //int y = 2; } //Здесь при проходе исключения нужно очищать стек, в котором хуй знает сколько членов, если для них не выделяется место при входе в блок сразу для всех [/code]
>>531300 Да дело не в проблемах, лол, я просто хочу понять, во что это все компилируется.
Алсо, сейчас посмотрел листинг, судя по всему, таки сразу в начале блока EBP сдвигается так, чтобы дать места всем переменным блока, а потом int x = 1 уже превращается в простое присваивание. Вот такое там: [code] ; 3 : int x = 1;
>>531298 Стек сам очистится. Если тебе принципиально вызов деструкторов у всех объектов, то в начале скопа обьяви все. Потом уже твой код с исключением
>>531447 Блядь, ну что за долбоебы на моей доске? Для локальных переменных гарантируется, что они будут выделены в автоматической памяти стеке, для статических - что в статической памяти сегменте данных, для динамически выделенных - в динамической памяти куче. Это регламентировано, листинги смотреть для этого не надо, маня.
Анан, как фастом (ну или просто хотя бы грамотно) поднять Qt и boost? Два года прогаю на MFC и это ж пиздец и не перспективно, короче думаю зря время трачу По Qt-у думаю это наверну >>531415, норм для старта?
>>531487 С сайта кьюта скачай кьют криэйтор. И буст с сайта буста. Если тебе из буста нужны только хедер-онли библиотеки, то просто путь для инклюдов добавь. Если нет, то ебись.
>>531453 Он внутри блока объявлен, поэтому на стеке. Длина в твоем случае не определяется во время исполнения, constexpr вообще не появляется в рантайме, а const появляется, но еще во время компиляции из нее будет выдрано значение в отдельную таблицу констант, которое станет статическим размером. Поэтому, например:
[code lang="cpp"] const size_t length2 = 128; const cast <size_t &> (length2) = 1; int bar [length2]; //Создается массив длины 128 [/code]
>>531504 >а const появляется, но еще во время компиляции из нее будет выдрано значение в отдельную таблицу констант, которое станет статическим размером.
Я для того кроме констэкспра и сделал просто конст, чтобы спросить, мол что если там значение, которое во время компиляции неизвестно. Компилятор умный конечно смекнет, что оно таки известно, но по C++ стандарту такое либо разрешено, либо нет. И если да, то значит оно как-то на стеке выделяется и для значений, которые во время компиляции не узнать.
>>531505 Константы тоже однажды или в каждом объекте свои? Сегмент данных это же статическая память? Если в классе использовать new/delete, то те члены класса будут в динамической? А если объекты с помощью new/delete создавать, то методы тоже в динамической? Чтобы ты всё тут не расписывал посоветуй статью на эту тему. мимопроходил
>>531506 Если там значение, которое компилятору неизвестно, то определение массива не скомпилируется. Стандартом определено понятие "константное выражение", которое может быть вычислено на этапе компиляции. Когда компилятор видит определение константы, он смотрит на ее инициализатор. Если там константное выражение, он запоминает его в таблицу констант и в дальнейшем имя этой константы тоже будет константным выражением. Если это константный параметр, который неизвестен, или инициализатор использует неконстантное выражение, то такого не произойдет. Когда ты пытаешься определить массив, в качестве размера допустимо только константное выражение, поэтому компилятор, видя внутри квадратных скобок имя константы, проверяет, является ли она константным выражением. Если да, то он уже знает ее значение, если нет - будет ошибка компиляции. Никакого определения размера в рантайме здесь быть не может. Это все, разумеется, по стандарту, но и расширения компиляторов такого не делают, ибо полностью бы поменялась концепция выделения памяти.
>>531507 Константность не влияет на это. Статическая константа будет одна, а нестатическая для каждого. Сегмент данных это статическая память. Если создать объект класса в динамической памяти, то его члены-данные из которых объект и состоит будут в динамической. Если просто использовать new в методах класса, то на члены это никак не повлияет, все будет зависеть от того, как был создан объект класса. Методы всегда создаются единожды, в сегменте кода, независимо от того, как создан объект, потому что метод принадлежит не объекту, а всему классу. http://en.cppreference.com/w/cpp/language/object http://en.cppreference.com/w/cpp/language/storage_duration
>>531509 Нихуя себе, и правда ведь. Никогда бы не подумал, что в C++ компилятор может разрешать компилировать штуку с одним объектом какого-то типа, но ругаться на другую штуку того же самого типа. Пиздец ебанутая хуйня. Лучше бы они вообще такие штуки запретили.
>>531511 Суть тут в том, что изначально в языке не было способа указать компилятору, что сущность содержит в себе константное выражение. Поэтому использовались const, как наиболее близкие к этому, и выполнялись дополнительные проверки на "статичность" ее значения. А сейчас в языке есть constexpr, с который специально предназначен для того, чтобы декларировать "статичность". Так что используй constexpr, и тебя эта проблема не коснется. А запретить такое использование const нельзя из-за обратной совместимости, легаси-код ведь тоже должен работать как-то.
>>531514 Ты можешь объявить factorial со спецификатором constexpr, очевидно же. Иначе как компилятор узнает, что можно выполнить его тело на этапе компиляции?
>>531530 У тебя в коде внешний цикл с единицы и первый элемент не будет отсортирован. Сравниваешь элемент массива с самим массивом, это вообще не скомпилируется.
>>531533 Если бы ты прочитал сообщение об ошибке, ты бы понял, что в constexpr-функциях нельзя использовать условные операторы. И исключения, кстати, тоже нельзя бросать.
>>531533 А не, это я еблан. Хотя вижуал студия тоже ебланская - сообщение об ошибке хуевое, подсвечивает использование функции в коде, а не то, что функция объявлена constexpr, но в ней запрещенные для constexpr конструкции.
Интересно, если я сделаю изменяющееся constexpr выражение и понаделаю array'ев с размером, задающимся им, вижуал студия обосрется с показом в редакторе их типа?
>>531549 1.4/2. Случаи, когда диагностики не надо, помечаются как "no diagnostic required", например, ошибки шаблонов или нарушения one-definition-rule.
>>531578 Ну, у тебя c не инициализирована, должно вылезти предупреждение. В остальном - ты вполне можешь его использовать, это просто будет постоянный индекс, не зависящий от цикла.
>>531596 Потому что в C++ sizeof это конструкция, вычисляемая во время компиляции. А когда компилируется функция, как она может вычислиться? Из этого я сделал вывод, что раз этот код вообще компилируется, то sizeof там выдаст такой же результат, как sizeof(int*).
>>531605 Да, но если у тебя 64-битная ОСи пекарня, это не значит, что все будет компилироваться под нее автоматически. Это тот еще геморрой, поэтому если нет требований к производительности, обычно компилируют для 32-bit и работают в режим совместимости.
>>531607 Судя по всему, ты решил по какой-то неизвестной причине выучить первым языком программирования C++. Это конечно пушка и совсем хуевое решение, но если уж ты решил и какое-то время на это потратил, то ладно.
И нет, ничего это не значит. Судя по куче моих знакомых, очень многие в начале много тупят на таких вещах, которые любому программисту кажутся очевидными.
>>531611 Хотя на самом деле я даже не уверен, насколько это хорошее или плохое решение, потому что многие считают C подходящим первым языком, потому что байтоеблю когда-нибудь изучить надо. А C++ Си в себя включает.
>>531615 Более странного и ебанутого, чем это, я не знаю. А так если подписаться на hackernews и reddit.com/r/cpp, то время от времени прикольные штуки попадаются.
Какой в C++ максимальный диапазон индексов массива? #define SIZE 40000 int seq[SIZE] работает нормально, а программа с #define SIZE 65000 int seq[SIZE] крашится при запуске.
>>531636 > Максимальный диапазон зависит от компилятора, каким типом он считает числовые литералы Имелось ввиду при такой реализации как у тебя (через дефайн).
>>531634 Нет лимита. Индекс должен влезать в size_t, который обычно 2^32 = 4294967296, но если он не влезет, ты получишь ошибку компиляции. С точки зрения лимита памяти, стандарт это не регламентирует, ты можешь запустить на машине с 640 килобайт памяти которых должно хватить каждому, лол и покрашиться уже на паре десятков тысяч. Стандартом регламентировано, что в этом случае должно бросаться исключение out of memory, емнип.
Как вообще экземпляр класса выглядит в памяти? И где он выделяется? Известно ли значение членов-переменных класса во время компиляции? Известно ли значение х во время компиляции, при х = sqrt(2) ?
>>531648 Как последовательно идущие: объекты его базовых классов есть нюансы, гугли empty base optimization, указатель на его vtable если есть хотя бы один виртуальный метод, его нестатические члены-данные, с возможными промежутками из-за выравнивания. Порядок может различаться, стандарт вроде бы это не оговаривает. Гарантируется, что данные-члены будут идти в порядке их объявления, возможно, есть еще какие-то гарантии для объектов базовых классов, хуй знает.
>>531648 Значение переменных неизвестно, это же переменные, блядь, они устанавливаются конструктором. sqrt не является частью языка, так что зависит от того, откуда ты ее взял. Если она объявлена constexpr, то будет известно, иначе нет.
>>531656 > Значение переменных неизвестно, это же переменные, блядь, они устанавливаются конструктором. Но они ведь инициализованы. > sqrt не является частью языка, так что зависит от того, откуда ты ее взял. Если она объявлена constexpr, то будет известно, иначе нет. То есть constexpr int x = f(y); не будет компилироваться, если f() не объявлена как constexpr функция?
>>531662 >Но они ведь инициализованы. Без разницы, инициализация членов класса всегда рассматривается не как потенциально константное выражение, а как нечто, что нужно тупо передать конструктору. Все, что ты пишешь после =, будет неявно скопировано в список инициализации конструктора A::A () : x { 1 } { ... }. >То есть constexpr int x = f(y); не будет компилироваться Именно так.
Анон, возвращаю из функции-шаблона указатель на объект и из-за этого ловлю сегфолт. До возвращения проверил - указатель указывает на то что нужно. Что за хуйня? Спасибо.
>>531684 Да нет возможности его показать. >Ты не можешь поймать сегфолт без разыменования. Я врать что ли буду, лол? До оператора return работает отладочная печать. После вызова этой функции печать не работает. Сигфолт именно в ретерне, но с чего бы это ему?
>>531689 А вот и неть. Под объект память еще давно выделялась динамическая. А эта функция поиска возвращает указатель на него и в этот момент сегфолтится.
Не могу посмотреть код, но функция объявлена как-то так template<typename karasique> typename sclad<payload>::yoba* sclad<karasique>::get(karasique& a) { ...Ищем йобу ранее добавленную йобу, возвращаем укащатель на нашу йобу return yoba_ptr; } Ну чому там происходит сегфолт?
>>531686 Указатель это примитивный тип, никакие действия с ним, кроме разыменования некорректного, не могут покрашить программу. Если ты не разыменовываешь его например, возвращая ссылку вместо указателя, то крашится не из-за этого. Например, у тебя может быть исключение в деструкторе какого-то из локальных объектов, или еще что-то подобное.
Как перегрузить оператор [][], если нельзя принимать два аргумента? Мне нужно именно перегрузить оператор, а не создавать одномерный массив[row*column+width] вместо этого.
>>531730 Оператора [][] нет. Перегружаешь [], который вернет объект класса, для которого перегружен [], который вернет значение. Будешь писать tvoya_mamka [15] [1];
>>531733 Непонял. tvoya_mamka [15] [1] обрабатывается как (tvoya_mamka [15])[1] кроме там случая нормального двумерного массива (который не массив указателей на массив).
Решил выучить C++. Но вот подумалось, ну прочитаю я пару книг, разберусь в синтаксисе, что куда писать и как из этого сделать программу. А дальше что? Чтоб развиваться же надо кодить, а что кодить? Где вы берете идеи?
>>531751 Случай двухмерного массива это не массив указателей на массив, а несколько одномерных массивов подряд. int a [5][10]; a [1] - второй по порядку массив из десяти интов. a [1] [2] эквивалентно (a [1]) [2], т.е. третий элемент этого "подмассива".
Раз вам нужно сменить тему, то помогите разобраться с сетью на С++. Совершенно не представляю как работают клиент-сервер и что это вообще такое. Могу написать 2 программы. Первая принимает переменную int и возвращает на единицу больше. А вторая тоже принимает int, но возвращает на единицу меньше. Обе через cin/cout это делают. И могу написать bush после 15ти минут в гугле который от одной программы вывод направляет на ввод другой, а вывод другой на ввод первой и зацикливает. Но эти программы должны лежать на одном компьютере, а я хочу чтобы они были на разных. И общались между собой без всяких башей. Как такое называется? Как сделать? Есть литература? Нужны дополнительные библиотеки?
>>531841 Нахуй это здесь спрашивать. Тред посвящен языку. Так же как и кто-то там выше пузырек пытался запилить, да нахуй спрашивать это в С++ треде, каким нахуй местом это касается языка?
const int D_HEIGHT, D_WIDTH; char dungeon; }; struct Row { Row(Dungeon& dungeon, const int y) : dungeon_(dungeon), y_(y){} Dungeon dungeon_; const int y_; char operator[](const int col) { return dungeon_(y_, col); } }; }
//DUNGEON.cpp Dungeon::Dungeon(const int height, const int width) : D_HEIGHT{height}, D_WIDTH{width} { char dungeon = new char[D_HEIGHT]; for (int i = 0; i < D_HEIGHT; i++) dungeon[ i ] = new char[D_WIDTH];
for (int y = 0; y < D_HEIGHT; y++) { for (int x = 0; x < D_WIDTH; x++) { dungeon[y][x] = NOTHING; } } }
char Dungeon::operator()(const int y, const int x) { return dungeon[y][x]; }
Row Dungeon::operator[](const int y) { return Row(this, y); }
>>531841 Есть нормальные высокоуровневые библиотеки для клиент-серверной работы. Casablanca, например, или libcurl старое проверенное говно мамонта. Только средствами языка ты заебешься делать что-то, кроме своего пинг-понга.
>>531841 > не понимаю как это работает. Для начала нужно почитать о модели OSI, об целях третьего и четвёртого подуровня и об устройстве протоколов IP, TCP и UDP. А после этого не заморачиваться и использовать библиотечные обёртки системных функций.
>>532028 Как-то плохо тупо писать в Dungeon.hpp в конструкторе только типы аргументов, без названий - ведь хедер это как бы интерфейс, и должно быть понятно, что оно делает.
А еще если ты берешь в качестве аргументов int копию, то нет никакого смысла делать const - const нужен если по ссылке, а так эти инты в любом случае копируются.
А еще спасибо, что спалил мне такой классный сайт. Буду им пользоваться теперь.
Догадка, что у тебя может быть не так. Ты уверен, что
char dungeon = new char*[D_HEIGHT];
создает то, что ты думаешь? Я просто плохо си знаю и не помню, как там работают все эти звездочки и скобки квадратные, когда их много. Если ты уверен, то ок. А если нет, то загугли и перепроверь, то ли там выделяется, что тебе нужно. И в деструкторе проверь, так ли delete[] работает, как ты думаешь.
Кстати, почему std::array или std::vector не хочешь использовать?
>>532031 Ну и создай новый main.cpp и посмотри просто, будет ли у тебя вылетать оно, если создать экземпляр твоего класса, разименовать каждый указатель в этом dungeon, и выйти. Без работы с файлом. И посмотри, когда вылетает - в констркуторе, в деструкторе или при разименовании.
>>532031 >А еще если ты берешь в качестве аргументов int копию, то нет никакого смысла делать const - const нужен если по ссылке, а так эти инты в любом случае копируются. Я просто тестил кое-что и теперь лень убирать.
> еще спасибо, что спалил мне такой классный сайт. Буду им пользоваться теперь. Не за что.
>>532036 Какой же ты мудак, блядь. Я минут десять втыкал в твой код, пока не понял, что ты в конструкторе выделяешь в локальную переменную dungeon вместо члена класса. Ой дурак, пиздос.
>>532047 В одном из предыдущих тредов обсуждалась замена Таненбауму, книжка по лекциям Машечкина. Ссылка тоже была там. Но вообще я бы на твоем месте попробовал Таненбаума, читается легко и интересно.
На SO советуют запускать с RunAsDate лол. Или регать мс акк, давать студии доступ к инету, логиниться, ставить себе анальные зонды. Ну охуеть теперь. free, блять.
>>532110 Да, в EE с 2008 студий никаких проблем никогда не было. А тут купился на ништяки типа плагинов, поставил Community, и на тебе. Буду знать теперь.
>>532107 Без проблем пользуюсь всякой продукцией, не требующей онлайна. Пусть попытаются что-то передать - файрволлы рулят.
>>532149 Любой, который ставит хук на сетевые функции и хер что сделаешь, будучи серьезным приложением. Например, Outpost. Или ты намекаешь, что и в нем могут быть анальные зонды, спонсируемые майкрософтом? Несереьзно, за столько лет уже спалились бы. Прокси + вайршарк, или что там сейчас юзают. Спалились бы == вой жуткий поднялся бы == потеря тысяч клиентов == банкротство. Нереально. Ну и как бы не Outpost-ом единым, есть и другие варианты.
>>532161 > сетевые функции Сетевые функции контролируются системой производства майскрософт. Если твой фаервол живет в среде операционной системы виндоуз то абсолятно вся информация которую он получает выдается ему системой (тоесть находится под контролем майкрософта). И если майкросфт захочет передать какую-то информацию фаервол (живущий в системе) никак помешать не сможет в принципе, он даже его не заметит. Шанс защищиться есть только снаружи, тоесть пытатся контролировать и анализировать исходящий трафик с помощью другой промежуточной машины, желательно с открытым ПО (как вариант виртуализация).
>>532183 Ну как бы да. Все адекватные айтишники послали десятку нахуй и решили, что после конца семерки переберуться на линукс.
>>532196 Верно пишешь. И выводы верные - любой скрипткиддис может посмотреть, наебывает ли нас майкрософт (обходит ли файрволл на уровне ядра) - с помощью всего лишь одной машины. Как только при включенном "mode: block all" пойдет траффик, значит, наебывает. Но за последние 8 лет такого никто не замечал, всё работает, клиенты довольны.
>>532273 Когда ты компилируешь под винду, то у тебя и дизассемблер проприетарный под виндой. И он может намеренно скрывать этот код, ну или винда видит запущенный дизассемблер и подменяет код для анализа.
>>532409 >Чему равен индекс 3 элемента вектора Почему просто взять и не спросить про начальный индекс любого массива? Нужно какую-то хуитень инопланетную спрашиать. Все через жопу и язык такой же черезжопный.
>>532424 > Почему просто взять и не спросить про начальный индекс любого массива? Это более очевидно, ньюфаг может и вспомнить. А так может запутатся, обосрется с ответом - появится шанс что запомнит.
>>532409 Ну например там есть ебланские вопросы "что такое вычисления?". А вообще я не знаю, что ты делаешь не так. Может ты пытаешься как на экзамене ответить, не гугля? Используй всю доступную информацию.
>>532434 Ну, я гуглю, но некоторые вопросы или термины даже гугол не знает и их в книге не нашёл. Например: << #include библиотека вывод компилятор вычисления и т.д. Может я что и знаю, но что на эти термины писать - я не понимаю. Я себе отдельый файл завёл в ворде для них.
>>532439 Лол. Если ты книгу читал, то тебе должны были про это что-то говорить, нет?
>вычисления Это вроде обычное слово. Что непонятного?
<< - оператор такой В C это побитовый сдвиг не помню в какую сторону. В C++ операторы можно перегружать, поэтому есть всякие stream'ы типа cout, с которыми он используется.
#include - вставить текст из другого текстового файла в этот при компиляции
библиотека - то, во что компилируется код, кроме запускаемого файла / просто нечто, что можно подключать к своему программерскому проекту и использовать оттуда всякие функции, классы и прочий код
вывод - ну типа то, что программа печатает, например через cout или printf
компилятор - программа, которая текстовые файлы с кодом превращает в бинарные файлы, с которыми может работать компьютер, у тебя это скорее всего g++, clang++ или майкрософтовский компилятор, встроенный в вижуал студию
И кстати это все еще ты, тот, кому на рандомном форуме посоветовали C первым языком?
>>532445 >И кстати это все еще ты, тот, кому на рандомном форуме посоветовали C первым языком? Нет, но я тут частенько спрашивал и приводил код. Помню, мне кто-то с локалом, стд и консолью помог в треде.
>>532439 Страуструп для новчиков хуево пишет. Попробуй другую книгу. А когда наберешься опыта и знаний, можешь начать читать Страуструпа "for mastery".
>>532439 На вопросы страуструпа отвечать не надо. Там достаточно что ты сам понимаешь что такое вычисление и компилятор. И когда он попросит Переписать калькулятор только чтобы перегрузить оператор тебе этого делать не обязательно т.к. до этого он ещё раз 5 даст такое же задание только другими словами опишет и размер исходного кода решения будет меньше.
>>532451 Вообще, стоит ли делать задания, которые я в уме решил? Просто, тут есть задание, которое делать и придумывать долго, но я его, как бы, в уме решил на ++.
На чем удобнее писать гуй под Шиндовс в VS2015 не вникая во всякие Qt и желательно с няшным графическим редактором? Уже давно перекатился с шарпа на кресты, но под десктоп все равно леплю на шарпаче и это уже заебало. Хетелось бы выкинуть его на помойку и забыть. Присматриваюсь к C++/CLI, но это же говно, да? Мб wxWidgets или что получше есть?
>>532468 >Просто, тут есть задание, которое делать и придумывать долго, но я его, как бы, в уме решил на ++.
Total manyamiroque.
Попробуй сделай теперь это задание от корки до корки в коде, и ты увидишь, насколько твоё "решение в уме" далеко от рабочего решения. По крайней мере, у меня так было, я делал все упражнения до единого (кроме одного в седьмом кажется параграфе, я так и не понял, чего он от меня хочет в той задаче).
А у вас бывает так что вы тестируете и пробуете что-то сделать, а потом РАЗ и сделали легко? Я, просто, сегодня целый день думал над задачкой Страуструпа, 5 тетрадных листов исписал всякими логическими выводами, а в конце взял и решил спокойно. Вроде правильно (задачка по угадыванию числа от 1 до 100): https://bpaste.net/show/7585607f3462
Я сначала хотел отсеивать по ифам и вопросам, типа меньше 50, чётное / нечётное, но понял что за 7 вопросов я это не сделаю и будет ОЧЕНЬ громоздким код, потом гугланул формулу Хартли и думал как сделать её цикличной. В итоге сделал, на ваш суд.
>>532741 Я бы вместо "if/else-if/else-if/else" сделал лесенку с отступами вправо. Кол-во веток в лесенке чётное, пустые ветки содержат ";" и больше ничего.
>>532773 [code lang=cpp] if (check == 'y') { max_value = div; div = (max_value + min_value) / 2; std::cout << "Does the number less than " << div << "? " << std::endl; std::cin >> check; } else if (check == 'n') { min_value = div; div = (max_value + min_value) / 2; std::cout << "Does the number less than " << div << "? " << std::endl; std::cin >> check; } [/code] Отличаются только 1 строчкой.
>>532741 Бля пиздец. Как же у меня с вас бомбит. Нахуя вы спамите своим говном в С++ треде. Блять, тред посвящен языку, и вопросом о языке. Создайте тред с алгоритмическими задачамитем более у тебя не задача а хуйня какая-то на 5 минут и решайте их там. Нет, ну серьезно, зачем просто постить здесь все подряд если у треда есть четкое направление?
>>532790 >C++ тред Действительно, какое же? Ну, как мне кажется, уместнее всего было бы задавать вопросы если не понимаешь какие-то механизмы абстракци языка, нюансы работы с памятью у этого языка, его библиотеки, и подобное.
>>532833 Типичная реакция зекачера на критику и пояснения. С таким подходом ты никогда не выучишь этот язык, тем более никогда не поучаствуешь ни в каком проекте, прибывая в забвении что если твоя лапша из циклов и условных операторов проходит пару тестиков придуманных тобой же, то значит что-то получается. Посылай нахуй когда тебе говорят вполне дельные и обоснованные вещи, еще пару месяцев попишешь хеловорлды и бросишь. Хотя если не бросишь это тебе же выйдет дороже, лол.
>>532833 >>532850 >>532853 Поглядите, сёмочке настолько неприятно, что аж попытался соврать как он все выучил и уличить меня в проекциях. Ой лол, смешно выглядит просто, не позорься.
>>532789 Ящитаю, вопросам непосредственно про язык должно уделяться большее внимание, чем алгоритмическим, но за неимением оных почему бы не подискутировать про алгоритмы на крестах? Кресты - язык многогранный, несколько тредов назад вон обсуждались ассемблерные детали, чтобы объяснить анону, как все работает под капотом. Это энивей интереснее, чем в десятый раз разжевывать долбоебам, где в памяти будет объект. Алсо, про алгоритмы на крестах есть неплохая книжка Седжвика, надо будет ее в шапку добавить. >>532854 >>532850 И не надо ссориться, ребят. Даже самые опытные здесь все еще чему-то учатся. Треды для того и созданы.
Привет Антон, я чутка оффтопну, но может повезет. Если кто тут серъезно работал(Ну или не серъезно, но сможет подкинуть материала) с аудио, может подскажете годного чтива по THD(Total Harmonic Distortion)?
Подскажите, я тут пробую задание сделать, чтобы при вводе цифр или строковых цифр простенький калькулятор их считал. Т.е. если бы я ввёл six / seven, то это было бы = 6 / 7. В общем, я это реализовал, но как сделать так, чтобы если я ввёл сами 6 или 7 они бы определялись?
Хотя, я может задачу неправильно понял: >Модифицируйте мини-калькулятор, описанный в упр. 5, так, чтобы он принимал на вход цифры, записанные в числовом или строковом формате. Вот мини-калькулятор из упр. 5: https://bpaste.net/show/99f47bccd0f1 (сам сделал, довольно просто)
>>532741 Ты, по-моему, умственно отсталый. Я помню эту задачу. У тебя число от 1 до 128 угадается не более чем за 7 попыток, т.к. log2(128) == 7.
Соответственно, для сотки алгоритм будет такой: есть минимальное число, есть максимальное. 6 раз берётся их полусумма и задаётся вопрос, больше ли это число. Далее меняется минимум (больше) или максимум (меньше) но полусумму.
Седьмой вопрос спрашивает, "это ли число?". Если да, овтет оно. Если нет, то ответ соседнее число.
>>532963 Труп Страуса писал свою книгу основываясь на своих же лекциях, начисто упустив тот момент, что у студентов есть доп. литература, да и спросить у него можно. Поэтому либо менять книгу на попроще, либо страдать. Во втором случае если справишься, то научишься искать инфу в интернете и уровень знаний будет повыше. Но заебешься. Собственно советовать новичкам Страуструпа и Кнута для самостоятельного изучения это старый прикол, потому что они для этого слабо подходят.
>>532993 Кстати с C без плюсов все наоборот - книга K&R была написана будто совсем для домохозяек, при том без воды. Всегда если у кого затыки в базовых вещах, советую её читать, хоть это и другой язык.
a=b()+c(d(),e()); Правильно понимаю? Сначала b потом d или e порядок не определён, а потом c. В каких ещё случаях есть неопределенный порядок выполнения?
>>533009 Вычисление аргументов функций, все арифметические операторы. Собственно, строгий порядок только у операторов && и || и , В с++11 что-то там подкорректировали, но не сильно.
>>533009 Нет. Сложение это обычная функция - оператор, поэтому порядок между b и c тоже не определен. В твоем примере можно гарантировать только что d и e вычислятся раньше c.
>>533009 Если вспомнишь, что в C++ есть operator+, а они не хотели бы, чтобы + вел себя по-разному для POD'ов и структур, то поймешь, что в этом отношении operator+ ведет себя так же, как любая другая функция.
Ubuntu 12.04 g++ 4.6.3 и выше. выполняя код на стареньком eeepc 701 я обнаружил что время выполнения задачи всё время одинаковое-47сек(выводится самой программой), хотя секундомером мерил оно доходит до 1минуты 5 сек. И доходило до 1минуты 50 сек при двойном запуске той же самой проги, программа всё равно выводит 47секунд.Пробовал запускать на настольном пк там составило 7 сек, но не стал морочиться с загрузкой ядер-там их несколько. Может ошибка какая-то в коде? float seconds; clock_t sstart = clock(); unsigned long wait=0; while(wait<4000000000) wait++; cout<<wait<<endl; seconds=(clock()-sstart)/CLOCKS_PER_SEC; cout<<"Время затраченное на складывание "<<wait<<"раз="; cout<< seconds<<endl;
Returns the approximate processor time used by the process since the beginning of an implementation-defined era related to the program's execution. To convert result value to seconds, divide it by CLOCKS_PER_SEC.
Only the difference between two values returned by different calls to clock is meaningful, as the beginning of the clock era does not have to coincide with the start of the program. clock time may advance faster or slower than the wall clock, depending on the execution resources given to the program by the operating system. For example, if the CPU is shared by other processes, clock time may advance slower than wall clock. On the other hand, if the current process is multithreaded and more than one execution core is available, clock time may advance faster than wall clock.
Прочитал страуструпа для нюфань почти всё понял. Теперь читаю лафоре чтобы всё закрепить. Он говорит про преобразование из одного класса в другой. Если оба этих класса сам писал. Так вот. Он пишет про оператор operator. А страуструп про него ни слова не сказал. Страуструп вроде позже на 5 лет вышел. Этот оператор не убрали? Почему про него страуструп не говорил?
Сап программач. Дошел до такой упоротой темы, как указатели. И возник у меня вопрос, зачем в таком случае придумали передачу переменной в функцию по ссылке, когда есть такая вещь, как указатели? Глянул викижопию, по ней выходит, что просто для того, чтобы все время звездочки не хуярить.
Коданы, а писать в builder и qtcreator - зашквар? На текущей работе альтернатив нет, вот и думаю, если увольняься, это будет котиррваться в других компаниях или нет.
>>533293 Это не просто operator, это operator float
>>533471 Затем, что указатели были в C, а ссылок там не было. А потом страуструп придумал ссылки и сделал C++. И ссылки - они типа удобнее и безопаснее например потому что нельзя с ними арифметические операции проводить.
>>533472 Не знаю, что за билдер. Qt Creator - одна из лучших IDE под плюсы. На мой взгляд из линуксовых самая лучшая.
>>533471 Ну вот есть у тебя вектор большого размера, который был где-то там, существует где-то там, но в каком-то случае в нём надо петушнуть тройку-другую элементов, может прочесть, а может изменить. Копирование не вариант не только потому что он большой, но и потому что он изменён должен быть вне функции, а не создан. Передавая ссылку, ты работаешь с собственно сущностью, а не адресом.
Вот передашь ты указатель на вектор, и что он тебе, v.size() расскажет?
>>533519 Не обязательно проверять на делимость со всеми числами меньше этого - достаточно проверить на делимость на все числа, которые меньше или равны sqrt(это число)
>>533599 Каждый конструктор может своим значением её инициализировать? Можно константу при создании объекта сделать одной, а потом присвоить её другое значение вызвав другой конструктор?
>>533608 В любом случае конструктор вызовется только один и только при создании объекта. Либо ты называешь конструктором что-то не являющееся конструктором, либо я не понимаю вопрос.
>>533609 >>533613 Если объекту типа А присвоить значение объекта типа В то вызовется конструктор А с 1 параметром В. Этот конструктор может изменить константу?
>>533487 >Затем, что указатели были в C, а ссылок там не было. А потом страуструп придумал ссылки и сделал C++. И ссылки - они типа удобнее и безопаснее например потому что нельзя с ними арифметические операции проводить. >
>>533627 >Где предположение что |z|<1 ? Ещё один "умник". Это формальные ряды. Буква z, x и т.п. вводится чисто для удобства и не имеет никакого числового значения.
>>533723 method1 - принимает в качестве аргумента константную ссылку на int. method2 - принимает в качестве аргумента float по значению и не изменяет объект, у которого вызывается.
>>533738 >Кнут типа альфач, показывает что срал на математиков с их глупым формализмом. У формальных степенных рядов нормально всё с формализмом. Кнут срал на зашоренных идиотов, у которых ряды == комплексные ряды.
Имеется массив current (тип неважен, если критично, считайте что char например, или int) размера 2 X streamsize. Имеется также файл filename размера streamsize, к которому прикреплён поток ifs:
Итак, мы прочли весь файл целиком и заполнили половину массива current. А теперь хотелось бы что-то типа "фигурного мемсета" -- чтобы заполнить вторую половину массива теми же самыми значениями. При этом, разумеется, не хотелось бы второй раз считывать данные с жёсткого диска.
Т.е. нужно скопировать первую половину массива в его вторую половину БЕЗ ЦИКЛА, т.е. максимально быстро. Как?
>>533814 Без цикла никак, такие операции должна память на уровне железа поддерживать, почитай документацию к своей памяти, но врядли такое есть вообще. Подобные операции усложнят архитектуру железа, если сейчас каждая ячейка памяти соединена с шиной, то для таких операций её еще нужно соединить со всеми остальными, что дорого. Там скорее всего есть поблочное копирование, собственно в памяти GPU сразу блоками копируется, но это блок, если данные не влазят в блок то без цикла все равно не скопируешь. А в обычной памяти и того может не быть.
>>533814 >>533830 >собственно в памяти GPU сразу блоками копируется И ещё это делают контроллеры DMA, есть в книгах Таненбаума. Перенёс байты — и прислал прерывание.
>>533814 >ifs.rdbuf()->pubsetbuf(0, 0); Зачем эта строка и зачем нули? То что это буфер я понял, а почему ты его убрал нет. >ifs.read(reinterpret_cast<char*>(current), streamsize); Тут reinterpret_cast зачем и почему используешь read?
>>533895 Реалтайм системы - это системы с фиксированным временем отклика. Разруливает все это планировщик ОС. Прикладные программы должны корректно обрабатывать сигналы.
>>533938 >Теперь вопрос - где здесь с/с++? Спросил чем на С++ занимается. Сказали что-то про реалтайм где высокая производительность нужна. Спросил тут что это. Чем обычн С++ программисты занимаются?
>>533947 Тем же, чем и другие программисты - пишут код, решают проблемы, создают системы. Си и плюсы чуть ближе к железу, больше простор для оптимизаций, поэтому их используют там, где нужна скорость и компактность: встраиваемые системы, высокопроизводительные системы (веб сервера тоже).
>>533956 >встраиваемые системы, высокопроизводительные системы (веб сервера тоже). Ну вот веб сервер это наверно интересно. Где про это почитать? Может кто из работающих рассказать про свой последний проект?
>>533956 За себя могу рассказать ещё: работал в компании, создающей софт для биржевой торговли - от краулеров биржевых данных, которые прям на самих биржах крутятся, до клиентских терминалов. Там такой хайлоад и тайм-критикал, что пиздец. Сейчас работаю в компании-производители автомобильной (и не только) навигации - встраиваемые системы, девайсы, онлайн-сервисы. А в основе всего ядро на плюсах. Тут и мемори-критикал и тайм-критикал. А еще ограничения железа всякие.
>>533964 >Где про это почитать? В книжках Ричарда Стивенса об устройстве сетей и серверов (у него две или три книги). >Может кто из работающих рассказать про свой последний проект? Примерно как на картинке. Основной процесс вызывает функцию «fork()» и дальше они работают раздельно.
>>533967 Нынешняя твоя работа наверно тоже интересная. Почитал про FreeRTOS и там вроде надо железо покупать. А я только 21 день учил С++ и хочу по инструкции сделать какой нибудь проект. Ради подобного баловство покупать железо не хочу. Есть какие нибудь симуляторы и инструкция как какой-нибудь простой проект с нуля?
>>533979 Поковыряй работу с устройствами - прямая работа с USB, например, - чтение и запись напрямую. Сделай из флешки токен авторизации. Под линукс - pam, под винду - логон менеджер.
Начал изучение по шилдту, все жутко интересно но есть такое ощущение что я аутист и жутко медленно продвигаюсь Кто за какое время осилил данную книгу? И эффективно ли будет попутно второй язык изучать? Или нет смысла?
Похоже на то, что нужно. Единственный момент: >нужно скопировать первую половину массива в его вторую половину >If the objects overlap, the behavior is undefined.
Что здесь подразумевается под "перекрываются"? Да, это один и тот же массив, но две половины не перекрываются физически. Это подпадает под overlap?
>>534252 это значит что ты копируешь область памяти в другую область памяти и эти области не пересекаются. Джае в твоем случае, ты разбиваешь массив на две непересекающиеся области.
Требование non-overlapped для производительности - нет доп проверок и лишних копирований во временную область.
>>533741 Const у методов значит что этот метод можно вызывать даже если объект константный. А int& это ссылка, т.е. ты будешь менять ту переменную, которая передается как аргумент, а не ее копию.
>>534264 >Требование non-overlapped для производительности - нет доп проверок и лишних копирований во временную область. Спасибо, это я прекрасно понимаю сразу после прочтения en.cppreference. Но там не было уточнено, что такое overlap.
А можно пример копирования одной половины массива в другую половину того же массива? А то я с указателями не работал никогда (C++ мой первый язык). На моём же примере как это написать:
Напомню, что current имеет размер в байтах 2 X streamsize, но заполнен ровно на первую половину. Как теперь скопировать его первую половину во вторую половину?
>>534309 dest = src + размер данных Если размер массива 100 байт то должно быть что-то типа, только проверь что тип src указатель на void или char, иначе там при суммировании скорее всего хуита получится std::memcpy(src + 50, src, 50);
>>534329 У меня uint16_t current размера 2 X streamsize (в байтах). То, что это массив short unsigned int (uint16_t), не критично для указателей memcpy? Вот я в этом не разбираюсь. То, что размер всего массива именно в БАЙТАХ мне точно известен как 2 X streamsize, я могу гарантировать. Тогда получается так:
>>534341 Проблема в арифметике указателей. В зависимости от типа current суммирование даст разные результаты. Ты должен посмотреть какого типа у тебя current (указатель на uint16_t), определить размер буфера в том типе указателем на который является current (если я правильно тебя понял это streamsize) и прибавить половину от размера буфера. Если current имеет тип указатель на uint16_t то прибавлять нужно streamsize/2 (если размер буфера выраженый в uint16_t является streamsize). Если current имеет тип указатель на void/char то прибавлять нужно streamsize (половина от размера буфера в байтах, который равен 2*streamsize). Если ошибок нет то кастить ничего не надо, будет неявное приведение. Для явности можно и добавить, но помоему это только читаемость ухудшит, вообще это внутрення реализация которая не должна наружу вылазить, если бы memcpy писали сейчас, то она скорее всего была бы шаблоном, а не принимала указaтели на void.
>>534386 >Проблема в арифметике указателей. Я вот их и не понимаю. Совсем. Далее я запутался. Я ещё раз повторю: У меня есть массив uint16_t current[n]. Его размер в байтах (именно в байтах) равен 2 X streamsize, причём данное значение не зависит от количества бит в байте (8 или 16). Я пишу кроссплатформенно. Т.е. >std::streamsize streamsize = sizeof(uint16_t) * n / 2;
Где std::size_t n -- (обязательно чётное) количество элементов массива uint16_t current. Так как теперь будет выглядеть строчка
>std::memcpy(current + ???, current, ?);
если мне нужно первую половину массива uint16_t current скопировать в его вторую половину?
>>534654 Вы недостаточно прочитали Ганса и Армадиллу. В те времена доллар был дёшев, а рубль относительно дорог. Сейчас наоборот. Поэтому ежели и случитьса жоппа, то другая.
>>533717 >>533759 Где ты видел комплексные ряды, пидор? Если z любой z больше 1, то ряд расходящийся, и нет у него асимптотической суммы. Ебнутый ты даун, у меня просто РЕКУРСИЯ от мамкиных математиков, немогущих в детские ряды.
>>533627 При |z| >= 1 в бесконечной сумме возникает undefined behavior поэтому на корректность утверждения всем насрать. Оптимизацию впервые увидел чтоли? Точно по той же причине, например, компилятор вправе проебать все твои проверки указателей на нуллы если ты до них пытаешься указатель разыменовать - на нулле это неопределенная операция, поэтому предполагается, что так не бывает.
>>534692 Оно-то будет, проблема в том, что раньше хотя бы от этого можно было съебать, а теперь ПРИДЕТСЯ ЭТО ТЕРПЕТЬ, потому что по всей видимости упадет спрос на программистов в мире в целом, а предложение на рынке труда только вырастет за счет выкинутых на улицу в период крузиса.
На внутреннем рынке работы тоже уже стало меньше, хотя мы дно еще даже не нащупали.
>>534688 int a - будет в стеке, удалится при завершении scope'а, это быстрее, чем выделять память в куче
int* a = new int; - создастся в куче, это медленнее, потому что надо запрашивать память у операционной системы, не удалится при завершении scope'а, а удалится когда удалишь.
>>534760 А если, например, есть цикл, а в нем есть "long a, b, c, d = 0;" и "double e, f, g, h, j, k = 0;", то что будет быстрее - выделить один раз перед циклом в оперативке, или каждую итерацию выделять в стеке? Я предполагаю, что компилятор может выделить один раз в стеке, а потом просто каждый раз сбрасывать значения, - этот вопрос скорее относится ко всяким функциям, которые едят входные данные и возвращают результат. Насколько дорого по скорости обходятся такие выделения, и стоит ли экономить на вспомогательных переменных в таких функциях?
>>534776 Ну, если компилировать с каким нибудь -o2 -- ещё и не такое сделает. Нет, стёк будет быстрее даже если каждый раз выделять по новой. Нет, экономить на переменных не стоит, прироста ты не увидишь (если у тебя не будет овер 9000 раз выделятся по мегабайту в цикле). Выделять память в куче и передавать её по указателям стоит только тогда, когда объём информации = овердохуя. Даже чтобы передать какой нибудь long long куча себя не оправдает. А вот если например есть 5 мб текста - оправдает многократно.
>>534744 Разница в том что стек фиксированного небольшого размера и очищается автоматически, плюс если от стековой переменной нигде не берется адрес то компилятор ее может в регистры запихать. Больше никакой. >>534747 Ссылку на стек тоже можно передать, только надо сделать какой-нибудь лок чтобы он не уничтожился выходом из функции.
Поясните нубу как работает брейк, а то я не совсем понимаю. Как я понял - как бы глубоко он не был, он останавливает всегда весь цикл? Т.е. например: for ... if if break - тут он останавливает (если сработает) 1 ступень цикла for как глубого в ифах он бы не был?
>>534776 Можно считать, что "выделять" что-то в стеке - вообще бесплатно, потому что на самом деле там ничего выделять не надо в отличие от динамической памяти, а надо всего лишь значение регистра изменить.
>>534910 >>534907 Причем самый вложенный цикл определяется статически во время компиляции. То есть например ты не можешь создать функцию без каких-либо циклов, написать в ней break и надяться, что если ты ее запустишь из цикла, то break сработает.
>>534744 Выделенная в куче память доступна на протяжении работы программы. Если ты выделяешь ее, например, внутри функции, и забываешь освободить, то ты допускаешь утечку памяти. Твоя программа начинает пожирать все больше и больше с каждым вызовом функции, пока система не начнет сбрасывать то, что не помещается, в файл подкачки. Частые выделения и освобождения произвольных кусков памяти разного размера приводят к быстрой фрагментации (Образуются дырки между выделенными участками памяти), что может замедлить работу программы.
Память, выделенная на стеке, "освобождается" с выходом из функции. Выделение памяти на стеке происходит гораздо быстрее выделения в куче. Стек по определению не подвержен фрагментации. Размер стека потока много меньше размера памяти доступной ОС, поэтому выделять на стеке в циклах не рекомендуется.
Почему я иногда вижу фигурные скобки в списке инициализации? Я всегда круглые делал. Это имеет какое-то значение? >Handle(Handle&& h) :p{h.p} { h.p=nullptr; }
>>534309 > Спасибо, это я прекрасно понимаю сразу после прочтения en.cppreference. Но там не было уточнено, что такое overlap. Это когда ты берёшь первые 2/3 массива и копируешь их в последние 2/3 массива. Или вместо 2/3 берёшь полмассива с округлением вверх.
Каким образом в конструктор класса можно передать функцию, так, чтобы переопределить метод? Конкретно, хочу реализовать кучу, в которой бы в конструктор можно было передать функцию сравнения двух элементов. Попробовал через указатель на функцию, но выглядит по-идиотски.
>>535423 У него же наверное инъекция зависимости. >>535416 Есть вариант функтор передавать. Много лишней писанины, но более гибкий и надежный (контроль типов, можно передать только нужные функторы а не любую функцию с подходящей сигнатурой).
>>535416 Наверняка ты хочешь сделать полную хуйню, которую не надо делать, но если все же надо, то принимай в конструкторе аргумент типа std::function, инициализируй им член и его и используй.
>>535589 Насколько я помню, в cygwin есть полностью все библиотеки юниксовые, то есть там есть даже реализация юникс форка под винду. В mingw насколько я знаю, этого нет.
А по названию предположу, что MinGW-64 - под архитектуру x86_64, а MinGW - наверное x86.
>>535589 mingw - для разработки нативных приложений под винду, вроде как заброшен, а разработка продолжается в mingw-w64, который может не только в 32 бита, но и в 64. Cygwin - эмуляция позикса под виндой, типа как wine на лине работает, некоторые хардкорно линуксовые приложения могут поддерживать конпеляцию под cygwin, но не под mingw, т.к. разрабы срали на поддержку винды.
Но, что в случае функтора, что в случае передачи непосредственно функции, мне непонятно, как сделать дефолтный метод, если в конструктор не был передан аргумент.
>>535789 тип array_1 и array_2 - int@? То есть это указатели на int? Если да, то присваивание делает так, что array_2 указывает туда же, куда и array_1.
>>535588 > При попытке запустить debugging выдаёт "no debugger set up". > Можно ли задействовать debagger от visual studio? В настройках (внезапно) задается путь к дебаггеру, какой тебе нужен, раз сам не нашелся. > Дебаггер не идёт в комплекте с creator? Qt Creator это ide, всё. Кроссплатформенная причем, везде со своими дебаггерами. Впрочем, под виндой, насколько помню, можно в комплекте с MinGW накатить, там тебе все мокрописьки из коробки будут.
Мне в программе нужно создавать миллионы объектов разных видов, и иметь возможность уничтожить их в долю секунты. Стандартный delete их убивает по одному очень долго. Поэтому написал свой аллокатор по типу pool. Я знаю, что в бусте есть то же самое, но мне было интересно научиться, к тому же, мой аллокатор в итоге работает чуть быстрее даже.
Для легкости встраивания в уже большую к тому времени программу, я создавал этот аллокатор как отдельный шаблонный класс со статическим пулом, статическими операторами new и delete (посмотрел - в инете так обычно и советуют), и, чтобы его использовать, достаточно просто наследовать от него нужные мне классы. Например, так: class Node : public FastpoolAllocator<Node> И всё! Теперь, чтобы создать объект Node, можно это делать, как обычно: Node* node = new Node(); При этом, так как пул и все остальное статическое, сами объекты не вырастают в размерах, и имеют общий пул, который можно очистить, обратившись к соответствующему статическому методу аллокатора.
Однако обнаружил проблему. Эта моя программа - плагин для другой программы. И, если та программа создает две инстанции моего плагина, они обе будут использовать один и тот же пул для одного вида объектов. Логично, ведь пул же объявлен как статический.
Проблему можно решить, если создавать отдельный класс аллокатора и объект, и потом, обращаясь к этом объекту, выделять память. Но это неудобно, придется переписывать все текущие создания объектов, сделанные красиво, как new.
Может, есть какой-то другой способ, позволяющий сохранить синтаксис new и deleteб но привязывающий пулы к конкретным экземплярам плагина?
>>535859 А, ну или еще можно передавать в доппараметрах к new и delete указатель на пул или сам аллокатор, это не так сильно меняет синтаксис, но всё-равно придется все выискивать.
Кстати, я заметил что мне проще решить задачку, расписывая её в тетради, а потом уже перенося в программу, а не сразу. Т.е. в тетради я сразу вижу ошибку, а в программе нет - значит я устарел или вы так же делаете?
>>535861 А ещё проще — воткнуть RAM-семафор, он же lock, выбрав самый быстрый. Тогда доступ к области памяти из двух потоков пойдёт синхронно. >>535876 Я тоже так делаю.
>>535958 Работает правильно, я так и задумывал с удалением и изменением размера вектора. Например: берётся число 2, удаляются все числа, которые делятся на 2 без остатка и вектор сокращается на это число. Потом берётся число 3, и проверяет деление уже оставшихся чисел - это суть решета Эрастофена.
>>535949 Нет, проблема не в многопоточности. Это у меня в самом аллокаторе уже реализовано. Проблема в двух экземплярах одного плагина - обе они используют один и тот же пул, потому, что пул объявлен как static, чтобы быть общим для всех объектов класса, унаследованного от FastpoolAllocator. В рамках одного плагина это даже удобно.
>>536447 Делать так можно, но надо быть аккуратнее с дальнейшим использованием объекта. Такое применяется часто для синглтонов, когда некий статический метод уничтожает объект синглтона
>>536492 > Как-то глупо, если за вызов деструктора для той-же бомбы отвечает внешняя среда. Почему глупо? Это правильный подход когда тот кто создает объект его же и уничтожает. Это конечно же не всегда можно красиво сделать, например когда объект используют в нескольких других местах - в таких случаях лучше шаред поинтер навернуть, который и удалит объект когда он станет не нужен. А так как объекты сами не принимают решение о своем создании, делать так чтобы объект сам себя удалял нужно только когда это действительно упрощает программу.
>>536762 Чукча не читатель, чукча писатель. Вообще, последнее издание "языка C++" уже с учетом всех фишек C++11, но оно пока только на ангельском. >>536531 Перетолстил, братюнь. >>536535 Там память утекает, скорость это еще не самое страшное. >>536492 Так они ведь и так "самоуничтожаются". Деструктор вызовется при выходе из области видимости автоматически, в случае кучи можно просто использовать unique_ptr, и будет тоже автоматически удаляться. >>535910>>535787 Ага. Тащемта, это я и написал выше, что стоит ее добавить. >>535789 >2015 >malloc >>535730 Они самые актуальные из существующих на русском, а в большинстве случаев и вообще только у нескольких русские издания отстают. Все старые книжки там не на тему синтаксиса, поэтому советы актуальны и сейчас почти все. Например, книги о шаблонах довольно старые, но лучше за десять лет ничего не написали, а большая часть информации осталась полезной, хотя с variadic templates многое стало можно сделать проще. >>534786 Он, возможно, имел в виду регистровые буферы, регистровые окна и вот это все.
ITT буду задавать дебиль ные вопросы по Qt. Если я наследуюсь от QObject и вставляю Q_OBJECT макрос, будут ли объекты моего класса автоматически удаляться?
>>536812 new это встроенный оператор, он может быть реализован компилятором гораздо эффективнее, чем вызов malloc, который обязан передаваться ОС. Юзать пул, например, или использовать данные об объектах, для которых выделяется память, чтобы уменьшить фрагментацию и позволить данным лучше кэшироваться в результате.
>>536671 Я уже не могу смотреть на переменные без приставок. Например int i; Ну что это такое? Вот понимаю - int *i; Да, это классно смотрится. Ещё есть какие-то reference. Расскажите про них?
>>536852 Объект в крестах удаляется только тогда, когда ты вызываешь delete, либо когда он выходит из скоупа (впрочем, во втором случае опять же неявно вызывается delete). Для указателя это тоже верно: сам указатель удаляется. А вот объект, на который он указывает - нет. В Qt нет никаких специальных GC или чего-то подобного, так что все сводится к вызову delete и выходу из скоупа. Пллюс еще, если у объекта есть родитель, то при удалении родителя будет удален и этот объект (и все другие дочерние объекты).
Я верю, что тут знают. Как мне из Visual Studio 2010 выдрать компилятор, и прочие хэдеры/либы? Накатывать саму студию займет слишком дохуя места, да и как IDE она мне не нравиться.
>>536935 Хэдеры лежат в "путь_к_папке_с_программой\VC\include", причем у стандартных нет расширения, поэтому придется добавить .h. cpp файлов вообще нигде нет, как и объектников, соответствующих единственному хэдеру. Те объектники, из которых все собирается, лежат в "путь_к_папке_с_программой\VC\bin", но там хер проссышь, какие именно линковать вручную, а для подмены с другим компилятором вряд ли подойдут, ибо внутренние форматы зело разные.
Советую не париться с либами и другим компилятором, а накатить отдельно Visual C++ как когда игоры устанавливаешь, можно будет компилировать из консольки.
>>536946 Там наркоманский at&t синтаксис ассемблера. >>536947 Последнюю строку нихуя не понял, подробнее. >>536949 Как ты узнал, что я на него решил перекатиться Для этого нужно тогда снести саму студию, но оставить компилятор и прочее, ибо 80гб хард - это не шутки.
>>536850 Оператор new определён в libstdc++, а это не компилятор хоть и идёт, обычно, вместе с ним. И точно так же как и маллок должен идти в ОСь, ибо откуда он память возьмёт? А зачастую он вообще маллок и пользует.
>>536856 Ну тогда откат наезда. Заработает, съест память, вскипятит океаны и заработает... И да, кто освобождать-то память будет?
>>537109 Не путай оператор new и функцию operator new. Первое - часть ядра языка, которая не имеет отношения к библиотекам, жестко зашитая в компилятор. Второе - обычная перегружаемая библиотечная функция. Память она возьмет, но гораздо реже, чем голый маллок. Например, она может брать ее сразу по мегабайту и потом раздавать по кусочкам, или использовать хитрые платформозависимые стратегии.
Быть должен тот, кто вскоре прочитает
Тот код, что в этом треде был рожден!
Здесь черви, что к крестам любовь питают,
Чтят байтоебство мудрости венцом
И Бьерна откровениям внимают,
Вновь корчатся в терзанье вековом,
Узрев template error'ов рой несметный,
И снова компилятор мнят врагом,
Не зная, что все их мученья тщетны.
Литература:
Для нюфань:
Три классических учебника для начинающих. Все примерно одинаковой годноты, читать имеет смысл только какой-нибудь один, который больше приглянется.
Герберт Шилдт - C++. Базовый курс (2010) - http://goo.gl/qMLAFl
Роберт Лафоре - Объектно-ориентированное программирование в C++ (2004) - http://goo.gl/QvjR6x
Стивен Прата - Язык программирования C++ (2012) - https://goo.gl/z7kA8u
Для желающих сразу начинать с Откровений Создателя - классика (может показаться суховатым):
Бьерн Страуструп - Программирование. Принципы и практика использования C++ (2009) - https://goo.gl/87qXtW
Учимся не писать говнокод:
Книги про основные подводные камни для тех, кто осилил предыдущий пункт. Следует пролистать все.
Скотт Мейерс - Эффективное использование C++ (2005) - https://goo.gl/wsDXGz
Скотт Мейерс - Наиболее эффективное использование C++ (1996) - https://goo.gl/tHa0tO
Скотт Мейерс - Effective Modern C++ (на ангельском) (2015) - https://goo.gl/uImH0J
Скотт Мейерс - Эффективное использование STL (2002) - https://goo.gl/QtS8Dc
Герб Саттер и Андрей Александреску - Стандарты программирования на языке C++ (2005) - https://goo.gl/Cpk4YR
Наиболее детальные описания языка:
Бьерн Страуструп - Язык программирования C++ (2010) - https://goo.gl/iZBDiV
Стандарт C++14 (на ангельском) - https://github.com/cplusplus/draft/raw/master/papers/n4140.pdf
Последняя на данный момент версия черновика стандарта C++17 (на ангельском) - http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4527.pdf
Тонкости языка (для гурманов):
Андрей Александреску - Современное проектирование на C++ (2002) - https://goo.gl/e1V5BC
Герб Саттер - Решение сложных задач на C++ (2002) - https://goo.gl/iWaa6S
Герб Саттер - Новые сложные задачи на C++ (2004) - https://goo.gl/4nn512
Также для легкого чтения подойдет книжка c историей создания C++:
Бьерн Страуструп - Дизайн и эволюция C++ (1994) - https://goo.gl/FqbPwo
Отдельные аспекты:
Читать по необходимости.
Энтони Уильямс - Параллельное программирование на C++ в действии (2012) - https://goo.gl/qJfBkD
Николаи Джоссатис - C++. Стандартная библиотека (2012) - https://goo.gl/PEyiMH
Дэвид Вандевурд, Николаи Джоссатис - Шаблоны C++. Справочник разработчика (2003) - http://goo.gl/0M4NpG
Ссылки:
Годный блог, в котором все просто и понятно тян не нужны кококок борщ - http://alenacpp.blogspot.ru/
Краткие описания библиотечных функций и контейнеров - http://ru.cppreference.com/w/
Блог Герба Саттера (на ангельском) - http://herbsutter.com/
Блог Скотта Мейерса (на ангельском) - http://scottmeyers.blogspot.ru/
Куда писать код:
Под шиндошс удобно использовать IDE Microsoft™ Visual Studio®. Базовую версию (2015 Community) можно бесплатно скачать, следуя инструкциям с этой страницы: https://www.visualstudio.com/ru-ru/products/free-developer-offers-vs.aspx. Чтобы начать писать код, нужно запустить Visual Studio, кликнуть "Файл - Создать - Проект - Пустой проект", после создания кликнуть слева правой кнопкой мыши по пункту "Файлы исходного кода", выбрать "Добавить - Создать элемент - Файл C++". Свои хэллоуворлды писать в этот файл, в дальнейшем можно добавить другие файлы и хедеры. Чтобы скомпилировать и запустить проект, нужно нажать "Сборка - Собрать решение", а затем "Отладка - Запуск без отладки".
Под *nix, как правило, уже предустановлен компилятор gcc (если нет, используй sudo aptitude install gcc), так что достаточно сохранить хэллоуворлд, набранный в текстовом редакторе, и выполнить g++ helloworld.cpp и ./a.out. Но удобнее установить какую-нибудь IDE, например, Code::Blocks (sudo aptitude install codeblocks) и работать в ней.
Можно также не устанавливать ничего, а запускать свои хэллоуворлды на http://ideone.com, выбрав в левом нижнем углу язык C++14.
Памятка:
Вопросу по синтаксису идут на хуй.
Лабы идут на хуй.
"Как мне сделать Х на чистых крестах без библиотек" идут на хуй.
Все идут на хуй.
Хейтер сосет члены на пару со своей мамашей.
Тег [code] работает через жабаскрипт-костыль: https://github.com/ololoepepe/MakabaCode
Предыдущий: