Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700

Чтение файла на этапе компиляции

03.04.2017, 11:46. Показов 2436. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Можно ли считать файл настроек на этапе компиляции?
Нужно что бы выбросить код который в рантайме не понадобится (в зависимости от настроек)
Если нельзя то какие есть варианты?

Добавлено через 4 минуты
В принципе думаю после того как бинарь будет готов настройки могут так же меняться и никто заново компилить прогу не будет...

Но все же хочется выбросить код который не нужен в зависимости от настроек... Может есть какой то хитрый вариант?

Добавлено через 2 минуты
Ну или не выбросить код а просто сделать так что бы его присутствие никак не влияло на скорость выполнения
Например хочется исключить 5 условных операторов из 10 подряд идущих...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.04.2017, 11:46
Ответы с готовыми решениями:

Ошибка на этапе компиляции
Добрый вечер. Ребят помогите, не могу понять в чем дело. Есть программа в которой описан 1 класс (работа с пользователями) Всё...

Ошибка на этапе компиляции
в чём может быть проблема?

C++14: вычисления на этапе компиляции
Добрый день. Есть такой код:struct Qaz { constexpr Qaz(uint8_t index) : _index(index) {} private: uint8_t _index; ...

14
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
03.04.2017, 12:01
Разруливать макросами

C++
1
2
3
#ifdef USE_THIS_CONDITION
    if (...) {}
#endif
а USE_THIS_CONDITION подсовывать компилятору при сборке.

Но при условии
Цитата Сообщение от sys_beginner Посмотреть сообщение
никто заново компилить прогу не будет
этого по понятным причинам не получится. Тогда если уж очень надо, то писать 2 разных кода и дергать ту или иную версию в зависимости от настроек, но это решение очень попахивает.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
03.04.2017, 12:06  [ТС]
Цитата Сообщение от Kastaneda Посмотреть сообщение
но это решение очень попахивает.
Согласен )

Чтож... печально
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
03.04.2017, 12:09
Цитата Сообщение от sys_beginner Посмотреть сообщение
Может есть какой то хитрый вариант?
ога.
хитрый препроцессор.

все настройки задаются дефайнами.
и далее в зависимости от,

вкл/выкл тот или иной код.

пример:
https://github.com/gammaker/In... Features.h

Цитата Сообщение от sys_beginner Посмотреть сообщение
после того как бинарь будет готов настройки могут так же меняться
заведите глобальный ассоциативный массив:

C++
1
2
//<имя_настройки, значение_настройки>
std::unordered_map< std::string, std::string> gSettings;
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
03.04.2017, 12:13  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
все настройки задаются дефайнами.
Но это же пользователь должен будет задавать настройки. Он может вообще не дружить с программированием либо может быть так что одна конструкция из нескольких строк в конфиге определяет выставлять ли определенный флаг...

Добавлено через 33 секунды
Цитата Сообщение от hoggy Посмотреть сообщение
заведите глобальный ассоциативный массив:
Не понял, а как это поможет выпилить код который уже собран?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
03.04.2017, 12:17
Цитата Сообщение от sys_beginner Посмотреть сообщение
Но это же пользователь должен будет задавать настройки. Он может вообще не дружить с программированием
мсье знает толк в извращениях
вы хотите чего то очень странного.

Цитата Сообщение от sys_beginner Посмотреть сообщение
Не понял, а как это поможет выпилить код который уже собран?
никак.
это поможет изменять настройки "на лету"
в процессе выполнения программы.

а вам вообще не мешало бы определиться,
чего вы вообще хотите.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
03.04.2017, 12:18
Цитата Сообщение от sys_beginner Посмотреть сообщение
Но это же пользователь должен будет задавать настройки.
если вы хотите выкидывать какой-то код в зависимости от настроек, то в любом случае придется перекомпиливать программу.
1
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
03.04.2017, 12:51
Цитата Сообщение от sys_beginner Посмотреть сообщение
Ну или не выбросить код а просто сделать так что бы его присутствие никак не влияло на скорость выполнения
Например хочется исключить 5 условных операторов из 10 подряд идущих...
Один вариант кода в DLL раз, другой вариант кода в DLL два. Какую DLL грузить - выбирать в зависимости от настроек.
1
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
03.04.2017, 13:02
Можно еще JIT запилить, генерить нужный код в зависимости от настроек. Но боюсь эта задача превзойдет по сложности решаемую изначально задачу
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
03.04.2017, 13:08  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
Один вариант кода в DLL раз, другой вариант кода в DLL два. Какую DLL грузить - выбирать в зависимости от настроек.
Сложно уж это поддерживать...

Добавлено через 26 секунд
Цитата Сообщение от Kastaneda Посмотреть сообщение
Но боюсь эта задача превзойдет по сложности решаемую изначально задачу
И медленнее наверное будет чем если бы эти условия торчали в коде
0
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
03.04.2017, 13:16
Цитата Сообщение от sys_beginner Посмотреть сообщение
Нужно что бы выбросить код который в рантайме не понадобится (в зависимости от настроек)
Перенести выполнение этого кода в скрипт (Python, Lua) и выполнять в зависимости от настроек.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
03.04.2017, 13:19  [ТС]
Цитата Сообщение от notAll Посмотреть сообщение
Перенести выполнение этого кода в скрипт (Python, Lua) и выполнять в зависимости от настроек.
Мне важна скорость Интерпретация будет однозначно медленнее
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
03.04.2017, 16:14
Цитата Сообщение от sys_beginner Посмотреть сообщение
Можно ли считать файл настроек на этапе компиляции?
Нужно что бы выбросить код который в рантайме не понадобится (в зависимости от настроек)
Если под словом "настройки" ты подразумеваешь именно "конфигурационные настройки сборки программы", а вовсе не "пользовательские настройки", то обычно делается файл config.h, в котором программист перед сборкой включает и выключает нужные настройки (обычно этот процесс делается не вручную, а программами-конфигураторами, но не суть)

Но, если я правильно понимаю, речь всё-таки идёт о пользовательских настройках. В этом случае "выбросить код который не нужен в зависимости от настроек" невозможно в принципе, т.к. ты заранее не знаешь, что понадобится, а что нет. Если имеется в виду "не занимать в памяти то, что не нужно", то решение уже озвучивали - реализовать через подгружаемые динамические библиотеки, других вариантов нет. Если на этом будут экономиться гигабайты, то однозначно это нужно делать. Если экономия будет составлять сотни байт, то геморрой того не стОит

Добавлено через 1 минуту
Кстати, операционная система рано или поздно сама выгрузит из оперативной памяти (в файл подкачки) неиспользуемые страницы памяти. Другое дело, что для того, чтобы этот процесс был эффективным, надо функциональность программы правильно распределить по памяти, чтобы фрагментировалось всё хорошо
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
03.04.2017, 17:03  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Кстати, операционная система рано или поздно сама выгрузит из оперативной памяти (в файл подкачки) неиспользуемые страницы памяти. Другое дело, что для того, чтобы этот процесс был эффективным, надо функциональность программы правильно распределить по памяти, чтобы фрагментировалось всё хорошо
А можно подробнее плиз?

Добавлено через 2 минуты
Именно интересно про правильное распределение памяти
Насчет подкачки понятно
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
03.04.2017, 19:51
Код в памяти нарезается страницами (обычно по 4 килобайта). Операционка подкачивает код в физическую (и виртуальную) память с точностью до страницы. Например, если понадобился байт памяти с адресом 0x5001, то в память будет помещена целая страница с адресами 0x5000-0x5fff

Можно, например, все процедуры, относящиеся к функционалу1 поместить в первые 4 килобайта, а все процедуры, относящиеся к функционалу2 поместить во вторые 4 килобайта. Таким образом, если в runtime по факту работает только функционал1, но не работает функционал2, то вторую страницу операционка рано или поздно откачает на диск (когда понадобится память для другого процесса) и не будет подкачивать обратно до конца работы программы (поскольку по факту эти коды запускаться не будут). Вполне возможно, что с самого начала страница не будет подкачана в память до тех пор, пока не появится её использование. Может быть даже и на диск откачиваться не будет, поскольку она на диске уже и так есть (в exe'шнике). Тонкостей работы этого механизма я не знаю

Однако если процедуры из функционала1 и функционала2 перемешать, то все страницы постоянно будут находиться в памяти, потому что из каждой страницы постоянно что-то будет использоваться за счёт использования функционала1. Т.е. получается разреженное использование адресного пространства, которое приводит к тому, что неиспользуемые адреса всё равно будут подкачаны в память как часть страницы
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.04.2017, 19:51
Помогаю со студенческими работами здесь

Несистематическая ошибка на этапе компиляции
#pragma hdrstop #pragma argsused #include &lt;iostream.h&gt; void main() { double a; int index,i_max,i_min; double...

Вычисление размера массива на этапе компиляции
Нашел код который вычисляет размер массива на этапе компиляции Но сам код мне не понятен. Объясните плз #include &lt;iostream&gt; ...

Уменьшение исполняемого кода на этапе компиляции
Существует набор регистров (переменных), которые нужно заполнять. Например есть набор Reg1...Reg10 В зависимости от режима работы,...

Проверка типа переменной на этапе компиляции
Добрый день. Прошу экспертов( ну или всех, кто это знает ) показать, как правильно &quot;повешать&quot; проверку времени компиляции на то,...

Шаблоны и определение SSE типов на этапе компиляции
Добрый вечер. Задача следующая: для каждого базового типа даных int, float и double есть свой intrinsic SSE тип - __m128i, __m128 и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru