Get Mystery Box with random crypto!

Sea

Logo of telegram channel sea_plus_plus — Sea  S
Logo of telegram channel sea_plus_plus — Sea
Channel address: @sea_plus_plus
Categories: Technologies
Language: English
Subscribers: 961
Description from channel

Interesting materials from C/C , Python, Go, Linux world and more by @sabbakumov | Интересные материалы из мира C/C , Python, Go, Linux и не только от @sabbakumov

Ratings & Reviews

4.67

3 reviews

Reviews can be left only by registered users. All reviews are moderated by admins.

5 stars

2

4 stars

1

3 stars

0

2 stars

0

1 stars

0


The latest Messages 2

2019-12-17 19:01:55 ​​ 19 декабря в 20:00 (мск) – День Открытых Дверей онлайн-курса «Разработчик C++».

Запишитесь, чтобы не пропустить: https://otus.pw/BEYH/

Встречу проведет преподаватель курса, Сергей Кольцов – TeamLead C++ в компании VisionLabs, опытный разработчик и инженер с более чем 10 летним стажем.

• Поговорим о программе курса, формате обучения и выпускном проекте.
• Ответим на все интересующие вас вопросы.
• Расскажем о программе трудоустройства, перспективах выпускников OTUS и 30+ работодателях, которые готовы предложить собеседования на вакантные позиции по итогу обучения.

Остались вопросы? Задайте их преподавателю лично в прямом эфире!

А также приглашаем пройти вступительный тест и поступить в группу со скидкой -30%: https://otus.pw/Mua8/
#реклама
1.3K viewsSergey Abbakumov, 16:01
Open / Comment
2019-12-16 19:41:05 Google Test v1.10.0

English version: https://telegra.ph/Google-Test-v1100-12-16

Относительно недавно вышла версия v1.10.0 Google C++ Test/Mock фреймворка для юнит-тестирования.

Ключевая особенность: теперь не нужно указывать число аргументов у переопределямого метода mock-класса. То есть вместо
MOCK_METHOD1(Bar, double(std::string s));

можно писать просто
MOCK_METHOD(double, Bar, (std::string s), (override));

Подробнее: https://github.com/google/googletest/blob/72adf7a4155b6642da1e6761678fe546590c0269/googlemock/docs/cook_book.md#creating-mock-classes
1.2K viewsSergey Abbakumov, 16:41
Open / Comment
2019-11-27 18:54:02 likely/unlikely

English version: https://telegra.ph/likelyunlikely-11-27

Многие задают вопрос про последнюю статью: что это за атрибут [[unlikely]]? Этот атрибут взят из черновика стандарта C++20: https://en.cppreference.com/w/cpp/language/attributes/likely

Он подсказывает компилятору, какая ветка условия или case в switch выражении выполняется чаще.
На x86/x64 компилятор поместит likely-ветку в ассемблере сразу же после проверки условия, максимально утилизируя кэш инструкций процессора. Никакого статического предсказания перехода тут нет. Однако не удивлюсь, что в какой-нибудь архитектуре PowerPC найдется отдельная инструкция для подсказки предсказателю переходов.

В компиляторах пока еще нет поддержки likely/unlikely атрибутов, но зато есть расширения:
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)

Пример (только Clang и GCC), где ожидаем, что IsValid() чаще будет возвращать true:
bool IsValid();
int Bar();
int Baz();

int Foo() {
if (likely(IsValid()))
return Bar();
else
return Baz();
}

Ассемблер:
Foo(): # @Foo()
push rax
call IsValid()
test al, al
je .LBB0_2
pop rax
jmp Bar() # TAILCALL
.LBB0_2:
pop rax
jmp Baz() # TAILCALL

Пример, где ожидаем, что IsValid() чаще будет возвращать false:
bool IsValid();
int Bar();
int Baz();

int Foo() {
if (unlikely(IsValid()))
return Bar();
else
return Baz();
}

Ассемблер:
Foo(): # @Foo()
push rax
call IsValid()
test al, al
jne .LBB0_1
pop rax
jmp Baz() # TAILCALL
.LBB0_1:
pop rax
jmp Bar() # TAILCALL

Можно заметить, что компилятор ставит сразу после проверки (команда test) соответствующую нашей подсказке ветку кода. Это потенциально может дать неплохое ускорение, если все правильно разметили (а ведь можно дать и неверную подсказку).
Нужно еще иметь ввиду, что сейчас процессоры очень хорошо предсказывают ветвления, так что разницу можно особо и не заметить.
1.4K viewsSergey Abbakumov, 15:54
Open / Comment
2019-11-14 19:22:53 Status macros

English version: https://telegra.ph/Status-macros-11-14

В продолжение к предыдущему посту об удобном способе обработки ошибок в C++.

В гугловых проектах используются специальные классы Status и StatusOr (см. https://t.me/sea_plus_plus/23), которые возвращаются из методов, в которых может произойти ошибка, например
Status WriteToFile(std::string_view content);
или
StatusOr ReadFromFile();

Обычным способом проверки является if:
Status Write(std::string_view content) {
Status status = WriteToFile(content);
if (!status.ok())
return status;

return Status::OK();
}

StatusOr Read() {
StatusOr content = ReadFromFile();
if (!content.ok())
return content.status();

return content.ValueOrDie();
}

Но это громоздко. В основном, используются специальные макросы (https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/stubs/status_macros.h):
Status Write(std::string_view content) {
RETURN_IF_ERROR(WriteToFile(content));
return Status::OK();
}

StatusOr Read() {
std::string content;
ASSIGN_OR_RETURN(content, ReadFromFile());
return content;
}

Макросы, в общем случае, не рекомендуется использовать в C++. Но тут, на мой взгляд, они вполне оправданы. К тому же в if внутри макроса можно поставить атрибут [[unlikely]] и получить прирост в производительности, а так пришлось бы в каждый if писать ее явно. В общем, в этом случае только польза.
1.4K viewsSergey Abbakumov, 16:22
Open / Comment
2019-10-28 21:49:25 Try, Go, Try!

English version: https://telegra.ph/Try-Go-Try-10-28

Некоторое время назад в среде Go появилось предложение о введении встроенной функции проверки ошибок try (https://go.googlesource.com/proposal/+/master/design/32437-try-builtin.md, https://habr.com/ru/post/472758/) за авторством Роберта Гризмера.

Это нужно для устранения повторяющихся проверок
if err != nil {
return nil, err
}

о которых не говорил только ленивый.

К слову, это уже не первое предложение ввести новые языковые конструкции для обработки ошибок. Уже были check и handle, о которых я уже писал (https://t.me/sea_plus_plus/77)

В новом предложении
f := try(os.Open(filename))

будет развернуто компилятором в
f, err := os.Open(filename)
if err != nil {
return nil, err
}
что весьма удобно.

handle не прижился из-за того, что был очень сильно похож на уже имеющийся механизм defer.

try будет реализован как встроенная функция. Во-первых, сделать ее обычной функцией не удастся, потому что нужно будет уметь выходить сразу из двух стек фреймов. Во-вторых, отказ от использования нового ключевого слова позволяет сохранить обратную совместимость с уже имеющимися парсерами Go.

UPD: предложение все же было закрыто.

Между прочим, C++ тоже не хватает, на мой взгляд, возможности выйти сразу из нескольких стек фреймов. Это проблему можно решить, к примеру, используя нестандартное расширение GCC и макросы: https://github.com/google/lmctfy/blob/master/util/errors.h#L229

И писать
std::string s = RETURN_IF_ERROR(FunctionReturnsStatusOrString());
получая здесь практически все то же самое, что дает try в Go.
1.5K viewsSergey Abbakumov, edited  18:49
Open / Comment
2019-10-21 05:02:08 Google Abseil Btree

В C++ библиотеку Google Abseil https://github.com/abseil/abseil-cpp/tree/master/absl/container, о которой я уже писал (https://t.me/sea_plus_plus/69), добавили четыре новых STL-like Btree контейнера: absl::btree_map, absl::btree_multimap, absl::btree_set и absl::btree_multiset. Данные хранятся в памяти, но под капотом алгоритм, который пришел из баз данных. Btree хранит несколько элементов в одном блоке памяти, что уменьшает количество аллокаций, а также за счет более эффективного использования кэша работает быстрее в большинстве случаев.

Это практически drop-in замена std::map и std::set. Однако при вставке и удалении происходит инвалидация итераторов. Поэтому надо быть осторожным.

English version: https://telegra.ph/Google-Abseil-Btree-10-20
1.8K viewsSergey Abbakumov, 02:02
Open / Comment
2019-10-15 10:30:10 Sea++ pinned «https://t.me/sea_plus_plus_chat — официальный чат канала Sea++. Здесь можно обсудить заметки и пообщаться с другими подписчиками. https://t.me/sea_plus_plus_chat — official Sea++ channel chat. Here you can discuss notes and communicate with other subscribers.»
07:30
Open / Comment
2019-10-15 10:30:04 https://t.me/sea_plus_plus_chat — официальный чат канала Sea++.
Здесь можно обсудить заметки и пообщаться с другими подписчиками.

https://t.me/sea_plus_plus_chat — official Sea++ channel chat.
Here you can discuss notes and communicate with other subscribers.
1.5K viewsSergey Abbakumov, 07:30
Open / Comment
2019-10-15 10:22:34 Rust в Amazon

Rust заполучил еще одного спонсора, компанию Amazon: https://aws.amazon.com/jp/blogs/opensource/aws-sponsorship-of-the-rust-project/

Пишут, что Амазон использует Rust в критичных к производительности компонентах Lambda, EC2 и S3.

Конечно, еще больше производительности можно было бы получить используя C++, что я покажу в одной из следующих заметок. Ставка на Rust сейчас — это вопрос долгосрочных инвестиций, когда фронтенд компилятора сможет наконец дотянуться до C++ и использовать всю имеющуюся информацию для оптимизации кода.

English version: https://telegra.ph/Rust-at-Amazon-10-15
1.4K viewsSergey Abbakumov, 07:22
Open / Comment
2019-10-11 12:38:25 CURL — это C

Интересное рассуждение автора библиотеки libcurl Дэниела Стенберга на тему выбранного для проекта языка C https://daniel.haxx.se/blog/2017/03/27/curl-is-c/

Главная идея: проект использует стандарт C89 для совместимости практически со всеми ОС и устройствами, все знают этот язык, переписывание на Rust дало бы огромное количество багов, которых нет сейчас, новые баги перимущественно возникают из-за логических ошибок в коде, а не по причине небезопасности языка.

Возможно, автоматические утилиты преобразования в unsafe Rust код помогли бы тут.

English version: https://telegra.ph/CURL-is-C-10-11
1.3K viewsSergey Abbakumov, 09:38
Open / Comment