Перейти к содержанию
    

Битовые поля, кто ж вас выдумал?

Наш ПЛИСовод ехидно посмеялся... У него некоторые проекты по паре-тройке часов собираются на довольно неслабом ПК:spiteful:

 

@haker_fox, а у Вас IAR? Не знаю, как там, но вот в Keil, если снять галки с "Debug Information", "Browse Information", компиляция проходит гораздо быстрее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 минут назад, jcxz сказал:

Так не надо все .h включать во всё сразу. И не будет "тянуть". По уму .h-файлы нужно включать только туда, куда нужно.

Вы, что же, не защищаетесь от многократных включений? Не шутите так. Каждый .h по разу используется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, ViKo сказал:

Вы, что же, не защищаетесь от многократных включений? Не шутите так. Каждый .h по разу используется.

Вы невнимательно прочитали пост, на который я отвечал. Или не поняли его. Перечитайте его ещё раз. "Повторное включение" тут не при чём.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, ViKo сказал:

Вы, что же, не защищаетесь от многократных включений? Не шутите так. Каждый .h по разу используется.

По разу в месте его включения и до конца файла. Но не один раз в одном проекте.

Защита от многократного включения вовсе не для этого.

Она для случая, когда

a.h:
#define A 100

b.h:
#include "a.h"
#define B A*2


main.c:
#include "a.h"
#include "b.h" // вот тут будет фаталити

 

А так, при разворачивании модуля (исходного файла), первым будет выполнена операция получения полного исходника - будут включены все нужные заголовочные файлы, развернутся макросы и т.д., и только потом все это будет подано на вход компайлеру.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, jcxz сказал:

Вы невнимательно прочитали пост, на который я отвечал. Или не поняли. Его перечитайте его ещё раз. Повторное включение тут не при чём.

Я понял. Не включать то, что не нужно вообще. Что это за совет? Примерно, как не есть ножом. Очевидно же. 

1 минуту назад, Arlleex сказал:

По разу в месте его включения и до конца файла. Но не один раз в одном проекте.

Именно, что один раз на весь проект.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 минуты назад, ViKo сказал:

Именно, что один раз на весь проект.

Вы заблуждаетесь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 minutes ago, jcxz said:

Тогда Вы какие-то сказки рассказываете.

И точно. Не туда посмотрел. Файлов у меня 217))) Так что нормально.

15 minutes ago, Arlleex said:

@haker_fox, а у Вас IAR?

Да, ИАР. 8.40.1)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 минут назад, ViKo сказал:

Я понял. Не включать то, что не нужно вообще. Что это за совет? Примерно, как не есть ножом. Очевидно же. 

Это означает, что например в файлах USB-драйвера подключать только .h-файлы, касающиеся самого USB-драйвера или общие .h-файл проекта. И не включать например .h-файлы SPI-драйвера или I2C-драйвера или файлы TCP стека и т.д.

Тогда при изменении например .h-файла из SPI-драйвера не будут перекомпилироваться все исходники проекта, а только те исходники, которые зависимы от этого .h-файла (файлы SPI-драйвера + может ещё несколько зависимых).

Цитата

Именно, что один раз на весь проект.

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

16 минут назад, haker_fox сказал:

И точно. Не туда посмотрел. Файлов у меня 217))) Так что нормально.

Когда вернусь в Ригу, то смогу измерить сколько занимает компиляция этого же проекта на аналогичном i5-3570 с 24гиг ОЗУ и SSD.  :yes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

https://ru.wikipedia.org/wiki/Pragma_once

https://docs.microsoft.com/en-us/cpp/preprocessor/once?view=vs-2019

Цитата

The use of #pragma once can reduce build times, as the compiler won't open and read the file again after the first #include of the file in the translation unit. It's called the multiple-include optimization. It has an effect similar to the include guard idiom, which uses preprocessor macro definitions to prevent multiple inclusions of the contents of the file.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 часов назад, ViKo сказал:

Ну и? Черным по белому же написано ровно то, о чем я и писал.

И даже если тупо в гугл транслит запихнуть приведенную Вами цитату, получим

Цитата

Однократное использование #pragma может сократить время сборки, поскольку компилятор не будет открывать и снова читать файл после первого #include для файла в модуле перевода. Это называется многократной оптимизацией. Он имеет эффект, подобный идиому include guard, который использует макроопределения препроцессора для предотвращения многократного включения содержимого файла.

 

Хоть перевод машинный, основную идею он передал в первозданном и однозначно понимаемом виде, разве нет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 минут назад, Arlleex сказал:

не будет открывать и снова читать файл

Вы так говорили? 
 

 

41 минуту назад, Arlleex сказал:

По разу в месте его включения

Вот как вы говорили.

То есть, вы по прежнему считаете, что #pragma once защищает от неоднократного включения в один файл?
Ладно... в единицу компиляции.
А когда разруливаются многократные определения? При сборке?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 минут назад, ViKo сказал:

Вы так говорили?

Я так не говорил. Это переведенная (даже не мной, а гугл-транслитом) Ваша цитата. Из каких-то там источников.

 

9 минут назад, ViKo сказал:

Вот как говорили.

Еще раз: pragma once (возможно) один раз считывает из файла его содержимое, а потом тупо подставляет это содержимое (уже прочитанное) каждый раз в то место, где этот #include подключается. Да, это оптимизирует время. Но Вы утверждали, что это содержимое включается один раз за весь проект. Или Вам тоже эту цитату привести? Вот, пожалуйста

48 минут назад, ViKo сказал:

Вы, что же, не защищаетесь от многократных включений? Не шутите так. Каждый .h по разу используется.

45 минут назад, ViKo сказал:

Именно, что один раз на весь проект.

 

Считывается из файла и подставляется в точке подключения - это разные вещи.

Да и pragma once будет работать ~также как #ifndef-#define-#endif, а время сборки проекта будет зависеть от того, было ли изменено содержимое этого .h-ника. И если было, разумеется, все модули, где этот .h подключался, будут перекомпилированы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

56 минут назад, ViKo сказал:

А когда разруливаются многократные определения? При сборке?

На этапе препроцессирования.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 минут назад, Arlleex сказал:

На этапе препроцессирования.

Если в .h файле определена inline функция, как спасёт препроцессор (работающий автономно для каждой единицы трансляции) от многократного определения функции?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

24 минуты назад, ViKo сказал:

Если в .h файле определена inline функция, как спасёт препроцессор (работающий автономно для каждой единицы трансляции) от многократного определения функции?

Спасёт голова программиста. Которая должна иметься в наличии. Программист, обладающий ею, будет подключать .h-файлы только в те .c(pp), где они реально нужны. А не во все подряд. Я об этом уже писал выше.

А если не включать все необходимые заголовочники в каждый компилируемый файл исходников, то как Вы себе представляете возможность многопоточной компиляции, при которой компилируемые исходники равномерно распределяются между ядрами CPU?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...