Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
миф 1; с использованием getchar(), isdigit() можно написать то, что будет быстрее против «полноценного» iostream.
(и да, в iostream внутри где-то была глобальная блокировка… вокруг разных кодировок, что ли? неважно, оно и так медленно).
В С-версии необходимо напрямую работать с символами и памятью:
Благодаря С++11, С++ стал более дружественным для новичков.
const string& в качестве аргументов для конкатенации. Что вы ответите на вопросы новичка «что такое const» и «и что такое &»?вызов виртуальной функции препятствует инлайнингу, что может раз в 50 замедлить вашу программу
Миф 3: В надёжных программах необходима сборка мусора
Приведённый код на C более длинный, но он примитивный, состоит из простых кирпичиков. Объяснить его гораздо проще. Примитивную реализацию strlen и strcpy даже показать можно. Никакой магии. То есть если припрёт обучать относительно низкоуровневому коду, но С как раз подходит лучше.
Ну и где доказательство надёжности для опровержения мифа?
std::string hello("Hello");
std::string world("world!");
hello + " world!"; // ok
"Hello" + world; // ok
"Hello" + " world"; // ERROR
// ok
std::array<int, 5> int_array = {1, 2, 3, 4, 5};
struct IntPair { int first; int second; };
// ERROR, WTF?!!!
std::array<IntPair, 2> int_pair_array = {{0,0}, {100,100}};
//ok
std::array<IntPair, 2> int_pair_array2 = {{{0,0}, {100,100}}};
too many initializers? Какого чёрта?
std::array является аггрегатом, у него вообще нету пользовательских конструкторов (в том числе и конструктора, принимающего std::initializer_list). Этот код аналогичен такому (кстати, в вышеприведенном коде не указана длина массивов, так что второй ok на самом деле не ok):struct array_type {
IntPair data[5];
};
array_type int_pair_array = {{0,0}, {100,100}};
std::array является аггрегатом, то при инициализации с помощью фигурных скобочек происходит aggregate initialization. А она смотрит, что внутри две пары фигурных скобок, а член данных у аггрегата только один (массив data), и поэтому выдает ошибку компиляции.// ok
switch(x){ case 3: };
// oops
std::string s;
switch (s) { case "3":};
std::string s;
switch (s)
{
case "1":
something;
case "2":
another_thing;
}
// ...
нельзя компилировать в std::string s;
if (s == std::string("1"))
goto case_1;
else if (s == std::string("2"))
goto case_2;
else
goto case_end;
case_1:
something;
case_2:
another_thing;
case_end:
// ...
Но ведь обязательно найдётся человек, которого operator==() не устроит, для которого надо будет выдумывать поддержкуswitch <[](auto x, auto y){ return x.foo == y.bar; }> (s)
{
case zog:
// ...
}std::array<IntPair, 2> int_pair_array = {(IntPair){...}, (IntPair){}}
const — гарантия неизменения состояния объекта
& — работа непосредственно с передаваемым экземпляром, без копирования
Или может быть в других языках нет операций взятия адреса или спецификатора const?
о все сразу думают про школу/институт/первый язык программирования?
Или может быть в других языках нет операций взятия адреса или спецификатора const?
Вот за весь этот путь я ни разу не оглянулся и не сказал: «какой сложный язык! А вот в Delphi/Java/C# бла-бла-бла на Ваш вкус».
make install делать не рекомендуется, если только вы ставите не в каталог, который потом будете подключать через LD_LIBRARY_PATH и который содержит либо только одну конкретную зависимость, либо только зависимости для одного конкретного проекта (соответственно, в обоих случаях его можно снести, зная, что именно при этом поломается и что именно вы сносите) — make uninstall далеко не всегда есть. Тот же CMake не генерирует его по‐умолчанию.JavaScript does not have any facilities to interact with the OS
JavaScript runs in a sand-box, meaning that it cannot interfere with the user's computer
если в NodeJS то пишешь свой модуль на C++ и что хочешь вызывай.
Да где то сделали готовую библиотеку для работы с тем же HTTP но как это связано с самим языком?Неправильно рассматривать язык отдельно, а библиотеки отдельно.
Неправильно рассматривать язык отдельно, а библиотеки отдельно.
Это очень удобно, когда вместе с языком ставится стандартная библиотека, которая решает 95% повседневных задач. Как в питоне например.
Давайте проведем эксперимент — посоветуйте мне библиотеку для работы с HTTP в С++?
Я уверен, предложите десяток вариантов. А мне нужен ровно один. И чтобы не было проблем с деплоем.
На всякий случай напомню контекст обсуждения — Страуструп утверждает, что C++ — разумный выбор, когда требуется написать маленькую одноразовую утилиту
Python 2: где обработка ошибок?
C#: угумс, но сначала поставим .NET для Windows
UNIX shell: оо, прям кроссплатформенное решение, вместе с использованием кроссплатформенных утилит lynx и grep.
PHP 5: очень смешно наблюдать, как язык который заточен под работу с web-технологиями сравнивается с С++ в возможности закачивать файлы.
веб-сервер, который, скорее всего, написан на С++
Разве что C++ поддерживает, кроме всего прочего, и функциональное программирование.
Да, и ещё Haskell популярный (извините заранее, никого не хочу задеть)
можно ли с javascript вызвать системную функцию, например ?
show_straustrups_links
Import["http://www.stroustrup.com/C++.html", "Hyperlinks"](iwr "http://www.stroustrup.com/C++.html").Links | %{ $_.href }Но ладно, сначала поставим какой-нибудь веб-сервер, который, скорее всего, написан на С++ — где можно будет запустить скрипт (правильно я понимаю, как работает PHP ?)Нет. Веб сервер — приложение, которое постоянно слушает какой-то порт (обычно :80) в ожидании http запросов, и на основе этих запросов решает какой именно скрипт вызывать, и нужно ли его вообще вызывать, или же достаточно выдать в сеть картиночку с котиком или статический html файл. Плюс всякие полезные штуки типа кеширования. Это не только PHP касается, но вообще всех «веб»-языков.
Паскаль хорош для обучения императивному подходу, классика.
Но после этой классики у нас только 3 из 50 въехали в функциональное и логическое программирование без особых проблем, у остальных были крайние непонятки
Зная достаточно С++, вам будет легко выучить С. Изучая С перед С++ вы столкнётесь со множеством ошибок, которых легко избежать в С++, и вы будете тратить время на изучение того, как их избежать.
Порядок изучения должен быть таким:
Почему asm первый? Может лучше сразу с машинных кодов начинать?С теории цепей и схемотехники.
И, наконец, какая из версий compose() более эффективная? С++ — потому что ей не надо подсчитывать символы в аргументах и она не использует динамическую память для коротких строк.Однако Великий слегка гонит — хотя оптимизация аллокаций для коротких строк за счет встроенного в std::string буфера возможна, никто не гарантирует что так и будет. Например в libstdc++ и libc++ это не так (стандартная C++ либа на Linux и новая либа от создателей Clang). Если скорость некоторого куска кода весьма важна, приходится разбираться и лезть в кишки.
try для подобных объектов. Пусть несколько членов-данных какого-то объекта реализуют этот метод close(), тогда внутри метода close() такого объекта мы должны будем явно вызвать руками все эти методы, тогда как для деструкторов в С++ соответствующий код будет сгенерирован автоматически.В плюсах вы должны взамен аккуратно использовать unique_ptr или shared_ptr.Ну уж нет, аналог вашей конструкции в плюсах — это простое создание объекта на стеке, деструктор будет вызван автоматически при выходе из области видимости.
В плюсах, насколько я понимаю, обработать исключительную ситуацию при закрытии ресурса не представляется возможным.Вы можете бросать исключения из деструкторов, тонкий момент тут только один: если в процессе раскрутки стека при обработке исключения из деструктора разрушаемого объекта бросается ещё одно исключение, то работа программы прекращается (вызывается
std::terminate()), что в целом довольно логично. Сделать как в Java невозможно хотя бы по той причине, что C++ не требует, чтобы объекты-исключения наследовали какой-то интерфейс, вы можете бросить всё что угодно, например, обычное число. C другой стороны у нас есть функция проверки не идет ли в данный момент процесс раскрутки стека (std::uncaught_exception()), поэтому с известными ограничениями можно попробовать реализовать подобный механизм самостоятельно.
Пять популярных мифов про C++, часть 1