«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как добиться отсрочки в стиле Go в C++ без ущерба для производительности?

Как добиться отсрочки в стиле Go в C++ без ущерба для производительности?

Опубликовано 16 ноября 2024 г.
Просматривать:645

How to Achieve Go-Style Defer in C   Without Sacrificing Performance?

Реализация Defer на C

Концепция defer в стиле Go, которая позволяет выполнять чистую и краткую очистку ресурсов, приобрела популярность в C . Однако найти стандартную или хорошо поддерживаемую реализацию этой функции в библиотеке может быть непросто.

Несмотря на отсутствие встроенной поддержки отсрочки в стандартной библиотеке шаблонов (STL) или Boost, существуют внешние реализации. . Одной из таких реализаций является легкое решение с нулевыми издержками:

#ifndef defer
struct defer_dummy {};
template  struct deferrer { F f; ~deferrer() { f(); } };
template  deferrer operator*(defer_dummy, F f) { return {f}; }
#define DEFER_(LINE) zz_defer##LINE
#define DEFER(LINE) DEFER_(LINE)
#define defer auto DEFER(__LINE__) = defer_dummy{} *[&]()
#endif // defer

Эта реализация требует минимальной настройки и может быть легко интегрирована в вашу кодовую базу. Синтаксис прост:

defer { statements; };

Например, в следующем фрагменте кода операция fclose автоматически выполняется при выходе из области действия функции read_entire_file:

auto file = std::fopen(filename, "rb");
if (!file)
    return false;

defer { std::fclose(file); }; // don't need to write an RAII file wrapper.

// ...

Эта реализация с нулевыми издержками предлагает удобный и эффективный способ управления очисткой ресурсов в C, обеспечивая функцию отсрочки, подобную Go, без необходимости использования сложных классов RAII или пользовательских методов управления памятью.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3