The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



"Обзор проблем в коде на C/C++, вызванных неопределённым пове..."
Версия для распечатки Пред. тема | След. тема
Форум Разговоры, обсуждение новостей
Исходное сообщение [ Отслеживать ]
Отдельный RSS теперь доступен для каждого обсуждения в форуме и каждого минипортала.
. "Обзор проблем в коде на C/C++, вызванных неопределённым пове..." +/
Сообщение от pripolz (?), 11-Июл-17, 12:14 
А шаблоны, несмотря на ряд косяков (синтаксис, отсутствие раздельной компиляции),
> позволяют делать с одной стороны достаточно высокуровневый, а с другой стороны,
> оптимизированный код.

Должен признать, С++ (но только на самом новом GCC) может кое-что, чего не может Си:
заполнять секцию данных (имеется ввиду большой и сложный массив) из кода с помощью constexpr и пары шаблонов. Из-за этого в коде Си можно встретить огромные заранее посчитанные массивы. Иногда они генерируются каким-нибудь скриптом на этапе сборки. Но всё же, было бы неплохо делать это компилятором. В случае С++, замечу, тоже не так уж удобно, и (на сегодняшний день) мало чем можно такое собрать.

Вот простейший пример кода:
http://coliru.stacked-crooked.com/a/944b535a8131ab77
(секцию данных можно проверить, указан компиляции -O3 -S main.s && cat main.s)
Обсуждение вопроса было здесь:
https://toster.ru/answer?answer_id=949231


Что касается простых шаблонных функций, на Си они легко делаются так:
- создал файл func.h, и записал туда
FUNC_DECL
{
// common code...

TYPE tralala;

#ifdef F_CASE1

// unique code

#endif

#ifdef F_CASE2

// unique code

#endif

// common code...

}

#undef F_CASE1
#undef F_CASE2
#undef FUNC_NAME

потом, там, где нужно нагенерить функций, просто инклудишь файл несколько раз:

#define FUNC_NAME int abc(int * a, int * b)
#define F_CASE1 1
#include func.h

#define FUNC_NAME int abc2(int * a, int * b)
#define F_CASE2 1
#include func.h

По такому шаблону можно ходить в отладчиках, как VS, так и gdb.

Кто-то скажет "фу, препроцессор", а на мой взгляд здесь всё гораздо лучше чем в темплейтах:
- потому что процесс генерации прозрачен и понятен.
- тут не нужно вспоминать тонкости синтаксиса, минимальное кол-во боли при ревизии.
- самое важное: гибкость. Можно нагенерить любую идею. В темплейтах не так. Можно абстрагироваться от типов, но если функции должны отличаться уникальными кусками кода (как в этом примере), что, замечу, ТРИВИАЛЬНЫЙ СЛУЧАЙ, тогда в С++ требуется создавать вспомогательные шаблонные классы.
- соберётся любой версией компилятора на любом железе.

Короче, препроцессор - это свобода.

Ответить | Правка | Наверх | Cообщить модератору

Оглавление
Обзор проблем в коде на C/C++, вызванных неопределённым пове..., opennews, 07-Июл-17, 11:12  [смотреть все]
Форумы | Темы | Пред. тема | След. тема



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру