Я компилирую и связываю свой код в Ubuntu 16.04 с G CC 5.4.0.
В моем большом проекте есть файл интерфейса, который описывает структуры в интерфейсе программы. Многие классы включают этот файл и объявляют члены из структур интерфейса.
Сначала все структуры интерфейса были без инициализации членов. Например:
Interface.hpp
struct Vertex {
double lon;
double lat;
int alt;
}
struct Debug{
int debugBuffer[5][3];
}
и компиляция некоторого определенного файла класса c привела к получению объектного файла размером около 553 КБ. Моя строка компиляции:
**release**
g++ -std=c++1y -I<all include folder> -m64 -c -fmessage-length=0 -Wno-reorder -Wno-unknown-pragmas -O3 -fPIC myfile.cpp
**debug**
g++ -std=c++1y -I<all include folder> -m64 -c -fmessage-length=0 -Wno-reorder -Wno-unknown-pragmas -O0 -g3 -fPIC myfile.cpp
После этого я изменил всю структуру на инициализированные элементы, например:
Interface.hpp
struct Vertex {
double lon = {33.0};
double lat = {35.3};
int alt = {0};
}
struct Debug{
int debugBuffer[5][3] = {{0}};
}
После этого изменения объект myfyle.o компилируется для отладки в 3 раза дольше и занимает 6,5 МБ. В релизе он вообще не будет компилироваться - без ошибок, просто зависнет через пару секунд. Процесс запускается, но он как бы входит в бесконечный l oop - просто нет вывода в терминал.
А теперь вопросы:
- Я не понимаю, почему инициализация так сильно увеличивает размер и почему компиляция занимает больше времени.
- Почему компиляция релиза застревает?
- Что я делаю неправильно? Я не хочу использовать инициализацию для интерфейса значений по умолчанию, так как мне сделать это, чтобы избежать таких проблем?
Спасибо.
PS Я могу не публикую sh реальный код, поскольку он находится внутри int anet и чувствителен.