Telegram Group & Telegram Channel
#compiler #advice

Не компилируйте шаблонный код каждый раз ⌨️

У меня есть травма детства, я не очень люблю шаблоны - считаю, что лучше их использовать в исключительных случаях. Есть не так много случаев, когда классы/методы должны быть шаблонными.

Я использую собственный индикатор: если параметры шаблона в теории заранее неизвестны, то он нужен (например std::vector<T>).
Если все параметры известны (например void make_sound<TAnimalCat/TAnimalDog/TAnimalBird>()), то лучше сделать виртуальный класс IAnimal.

Но часто приходится работать с устоявшейся архитектурой, поэтому представим, что у нас есть шаблоны для конечного числа параметров.

Сам шаблонный код еще ничего не делает. Только когда вызывается метод/класс с некоторыми параметрами шаблона, шаблон "инстанцируется", то есть генерируется уникальный метод/класс под эти параметры.
При компилировании каждого .cpp-файла (которых может быть сотни) мы часто вынуждены компилировать один и тот же участок кода - пример на godbolt.

Инстанцированные шаблонные методы имеют linkage type linkonce_odr, подробнее про него тут - https://www.group-telegram.com/us/cxx95.com/38

Чтобы избежать компиляции одного и того же кода в каждом .cpp-файле, можно под шаблоном "объявить инстанциации" для всех известных параметров через extern template - пример на godbolt.
В таком случае где-то нужно "определить инстанциации" - для примера выше нужно в условном some_header.cpp написать:
    template int calc<float>();
template int calc<double>();
Теперь код в шаблоне будет компилироваться всего один раз.

Однако можно и весь шаблонный код держать в своем .cpp-файле, часто это упрощает читаемость - пример на godbolt.

Можно оценить полезность разных подходов:
🚬 Подход с extern template является полумерой, потому что обычно выигрыш в скорости компиляции абсолютно незначительный
🤤 Подход с шаблонным кодом полностью в своем .cpp-файле неплох, улучшает читаемость кода
Please open Telegram to view this post
VIEW IN TELEGRAM



group-telegram.com/cxx95/56
Create:
Last Update:

#compiler #advice

Не компилируйте шаблонный код каждый раз ⌨️

У меня есть травма детства, я не очень люблю шаблоны - считаю, что лучше их использовать в исключительных случаях. Есть не так много случаев, когда классы/методы должны быть шаблонными.

Я использую собственный индикатор: если параметры шаблона в теории заранее неизвестны, то он нужен (например std::vector<T>).
Если все параметры известны (например void make_sound<TAnimalCat/TAnimalDog/TAnimalBird>()), то лучше сделать виртуальный класс IAnimal.

Но часто приходится работать с устоявшейся архитектурой, поэтому представим, что у нас есть шаблоны для конечного числа параметров.

Сам шаблонный код еще ничего не делает. Только когда вызывается метод/класс с некоторыми параметрами шаблона, шаблон "инстанцируется", то есть генерируется уникальный метод/класс под эти параметры.
При компилировании каждого .cpp-файла (которых может быть сотни) мы часто вынуждены компилировать один и тот же участок кода - пример на godbolt.

Инстанцированные шаблонные методы имеют linkage type linkonce_odr, подробнее про него тут - https://www.group-telegram.com/us/cxx95.com/38

Чтобы избежать компиляции одного и того же кода в каждом .cpp-файле, можно под шаблоном "объявить инстанциации" для всех известных параметров через extern template - пример на godbolt.
В таком случае где-то нужно "определить инстанциации" - для примера выше нужно в условном some_header.cpp написать:

    template int calc<float>();
template int calc<double>();
Теперь код в шаблоне будет компилироваться всего один раз.

Однако можно и весь шаблонный код держать в своем .cpp-файле, часто это упрощает читаемость - пример на godbolt.

Можно оценить полезность разных подходов:
🚬 Подход с extern template является полумерой, потому что обычно выигрыш в скорости компиляции абсолютно незначительный
🤤 Подход с шаблонным кодом полностью в своем .cpp-файле неплох, улучшает читаемость кода

BY C++95


Warning: Undefined variable $i in /var/www/group-telegram/post.php on line 260

Share with your friend now:
group-telegram.com/cxx95/56

View MORE
Open in Telegram


Telegram | DID YOU KNOW?

Date: |

NEWS Unlike Silicon Valley giants such as Facebook and Twitter, which run very public anti-disinformation programs, Brooking said: "Telegram is famously lax or absent in its content moderation policy." Telegram has become more interventionist over time, and has steadily increased its efforts to shut down these accounts. But this has also meant that the company has also engaged with lawmakers more generally, although it maintains that it doesn’t do so willingly. For instance, in September 2021, Telegram reportedly blocked a chat bot in support of (Putin critic) Alexei Navalny during Russia’s most recent parliamentary elections. Pavel Durov was quoted at the time saying that the company was obliged to follow a “legitimate” law of the land. He added that as Apple and Google both follow the law, to violate it would give both platforms a reason to boot the messenger from its stores. Telegram was founded in 2013 by two Russian brothers, Nikolai and Pavel Durov. "Russians are really disconnected from the reality of what happening to their country," Andrey said. "So Telegram has become essential for understanding what's going on to the Russian-speaking world."
from us


Telegram C++95
FROM American