Сбой компиляции с инициализацией членов структур C ++ - PullRequest
0 голосов
/ 27 января 2020

Я компилирую и связываю свой код в 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 - просто нет вывода в терминал.

А теперь вопросы:

  1. Я не понимаю, почему инициализация так сильно увеличивает размер и почему компиляция занимает больше времени.
  2. Почему компиляция релиза застревает?
  3. Что я делаю неправильно? Я не хочу использовать инициализацию для интерфейса значений по умолчанию, так как мне сделать это, чтобы избежать таких проблем?

Спасибо.

PS Я могу не публикую sh реальный код, поскольку он находится внутри int anet и чувствителен.

...