The OpenNET Project / Index page

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



Индекс форумов
Составление сообщения

Исходное сообщение
"Обзор проблем в коде на 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.

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

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

 

Ваше сообщение
Имя*:
EMail:
Для отправки ответов на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



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

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