Маша С++
104 subscribers
54 photos
2 files
65 links
Учу C++ и не только вместе с вами, мои котятки)
Download Telegram
Лично я считаю, что auto в c++ нужно использовать только тогда, когда это повышает читаемость, например когда тип уже находится на той же строке кода или тип не так важен, например итератор. Ненавижу когда используют auto для вывода типа результата вызова функции: auto r = f();
Приходится открывать объявление f, чтоб убедиться, что она возвращает то что нужно. Еще мне кажется, что частенько auto это лень кодописателя, перекладываемая на кодочитателя. На мысль написать про
auto натолкнула эта статья https://habr.com/ru/articles/754662/
#cpp
🔥1
Есть такой канал (не реклама) "Книги для программистов", там делают краткий обзор книг и дают ссылку на скачивание (не делайте так, ок?☺️).
Постов много, книги вроде свежие, но мне что-то ничего не приглянулось, за качество обзоров также не ручаюсь. Поискала тему "CMake" и нашла лишь одну, хотя книг много (позже поделюсь), так что вооот.
Подписчиков: 155k.
Ссылка: https://t.me/progbook
#обзорканалов
Ужас, почему я этого не знала. 😱 Оказывается поток ввода можно связать (tie()) с потоком вывода, так что чтение из ввода приведет к сбросу (flush()) буфера потока вывода.

Так, библиотечные cin и cout уже связаны, а потому например приглашение на ввод от cout<<"enter:" гарантированно выведется при запроса на ввод от cin >>val.

Связать можно и другие потоки, например fstream. Подробности тут: https://en.cppreference.com/w/cpp/io/basic_ios/tie

Алярм: это нет тот tie(), что в <tuple>😉.

#cpp
Наверное уже многие видели, что в C++ 26 добавят переменную _ , да да прямо как в этом вашем питоне.
Что это дает? Например, можно забить на неиспользуемую переменную в цикле, да так что не будет ворнинга от компилятора.
Пример:
    std::size_t count = 0;
for (const auto& _: list) {
++ count;
}

А еще теперь можно не ломать голову над названием блокировок (самая мякотка в том, что деструктор вызовется так как вы и ожидали):
std::unique_lock _{list_lock};

Ну и конечно же распаковка кортежей:
auto [_, _, value, _] = list.do_something();

Больше про эту тему и другие нововведения про C++ 26 расскажет Антон Полухин тут (все примеры оттуда): https://habr.com/ru/companies/yandex/articles/753260/

#cpp #cpp26
👍1
К слову о пиратстве. Это плохо, да и тупо незаконно. Я как-то читала книгу по JS и там в начале было написано, что автор потратил на ее написание целый год фуллтайма и просил (именно просил) её не пиратить, так как жил он все это время на продажи других своих книг. К слову, книгу я эту купила, хотя это было дорого. Но бывают случаи, когда книга старая и ее никак не достать даже в библиотеке, или ее нельзя купить или вы нищий студент и денег тупо нет.
Для таких случаев некоторые нехорошие люди используют Library Genesis, которую находят через поисковик. А вот вы не делайте так, пиратство это зло 😁
ТГ-канал любимейшего новостного (и не только) портала об opensource opennet.ru.
Комменты конечно же нужно читать на самом сайте (а также писать, ведь есть аноним), но вот быстро получать новости в любимой тележеньке можно и через канал (официальный он или нет я не знаю).
Подписчиков: 10k
Ссылка: https://t.me/opennet_ru
#обзорканалов
Бесполезное. В C++14 в <iomanip> добавили std::quoted(), которая позволяет обрамлять строку двойными кавычками и экранировать обратным слешем кавычки внутри строки (как в CSV или XML). Пример:
#include <iomanip>

std::string str("str\"ing");
std::cout << std::quoted(str)

Выведет (да, вот так вот с 3 кавычками и слешом):
"str\"ing"

Без quoted выведет: str"ing

Двойные кавычки и слеш можно заменить другими символами, если дефолтное поведение не нравится.

Наверное это также может быть удобным при отладке. Плюс, quoted() можно использовать для обратного процесса (отковычивания), если взять поток ввода, а не вывода.

Подробности: https://en.cppreference.com/w/cpp/io/manip/quoted

#cpp
Из OBS 30 будет удалена поддержка Ubuntu 20.04 (🥺) и Qt 5 (переход на шестую версию).
А вот коммерческие продукты, похоже, не спешат дропать "пятерку" Qt, что-то я 6-ку еще не видела нигде...
#opensource #qt
У std::atomic есть метод exchange, который атомарно сохраняет переданный аргумент в this, при этом в этой же "транзакции" возвращает старое значение this.
Получается атомарный read-modify-write, то есть другой поток не вставит свое значение в процессе:
std::atomic<int> x;
int y;
int z = x.exchange(y) // atomically: z = x, x = y

Если вы вдруг не поняли сразу (как я), то exchange() не эквивалентен последовательным вызовам load() и store():
z = x.load(); // not
x.store(y); // atomic !

Понятное дело, что возвращается копия старого значения и по идее, к тому времени когда я просмотрю эту копию, другой поток уже может изменить значение атомика. Возникает вопрос, а в чем тогда смысл и применение этой операции? Ну есть там memory_order вторым параметром, и что?

Оказывается, что есть применение для реализации спинлока:
std::atomic<bool> lock;  // == false
{ // критическая секция, пытаемся захватить lock:
while (lock.exchange(true)) { } // захватили lock
/* наши данные в безопасности */
lock = false; // отпускаем lock
}
Это работает, потому что нам не важно текущее значение атомика, а факт того, что именно наш поток его изменил.
Других применений, кроме как для atomic<bool> пока не нашла.
#cpp #multithreading
Интересная научная статья фокусируется именно на потреблении энергии (CPU + RAM) в дополнении к памяти и времени работы. Авторы сравнивают 27 популярных языков программирования, замеряя потребленные Джоули при решении 10 задач. Замер потребления энергии производится с помощью утилиты Intel’s Running Average Power Limit.

В финальной таблице (см пост ниже) по всем задачам можно например заметить как Java потребляет в 5 раз больше рамы, чем Си. По потреблению энергии и по времени работы в первой тройке C, Rust и C++. Примечательно, что Rust почти не отличается от C, а вот C++ отстает на 30-50%. В статье приводятся результаты для трех задач: binary-trees (выделение, обход и удаление множества двоичных деревьев), fannkuch-redux (индексируемый доступ к крохотным последовательностям интов) и fasta (генерация и запись случайных последовательностей ДНК). В первых двух задачах лидируют C/C++, в третьей же - Rust, при этом C++ в ней довольно заметно отстает. С чем это связано не понятно, возможно на плюсах медленнее вывод в файл или генератор случайных чисел. Ставить под сомнение сводные результаты 10 задач на основе данных по 3 я не буду.

Интересно, что Python уверенно занимает предпоследнюю строчку и в 70 раз "хуже" Си. Спасай природу, переписывай свой питон код на Си 😁

Полный текст статьи: https://haslab.github.io/SAFER/scp21.pdf

#cpp #rust #performance
🔥2
exa (цветастая замена для ls) кажется заброшена
https://github.com/ogham/exa

#github #opensource