Объекты с внутренним связыванием и нетривиальным конструктор
От: Alexander G Украина  
Дата: 15.02.16 09:17
Оценка: +1
Вот такое встречается:

// In header
const std::string SOME_STR = "some value";
const std::string SOME_STR_ARR[] = { "some value one", "some value two" };


(вместо std::string можно QString или CString по вкусу, или даже не строку. вместо const можно static const — разницы не делает).

Надо избегать, особенно в больших проектах с большим числом взаимосвязей.
Потому что компилятор реально создаст такой объект на каждую единицу трансляции, куда хедер включен.
(Выбросить не может, видимо, потому, что это .dll вызов)
И время линковки растёт как число .cpp, куда хедер прямо или косвенно попал, умноженное на количество таких объектов в нём.

В моём текущем проекте время линковки место одной минуты было пять, и это время, которое тратится даже при изменении одного файла!

Фикс — изменение на простой указатель, которому конструктор не нужен, и который легко выбрасывается:
// In header
const char* const SOME_STR = "some value";


ну или отказ от внутреннего связывания:
// In header
extern const std::string SOME_STR;
// In .cpp
extern const std::string SOME_STR = "some value";
Русский военный корабль идёт ко дну!
Отредактировано 15.02.2016 9:18 Alexander G . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.