Удаление статических глобальных объектов с LLVM LTO - PullRequest
0 голосов
/ 22 мая 2019

Я работаю над статической библиотекой, которая связана в несколько бинарных файлов.Моя цель - уменьшить объем памяти моей библиотеки, когда она становится связанной.

Пользователям моей библиотеки требуются определенные глобальные объекты, которые я создаю в файле cpp в моей библиотеке, а затем экспортируем файл заголовка, который имеетextern объявлений этих переменных.

Проблема в том, что в зависимости от того, как библиотека используется, некоторые из этих глобальных переменных могут вообще не использоваться.

В следующем коде показана структура моего кодав некоторой степени:

Foo.hpp:

class Foo
{
    static int      sFooListIndex = 0;
    static Foo *    sFooList[10] = { nullptr };

public:
    Foo()
    {
        if(sFooListIndex < 10)
        {
            sFooList[sFooListIndex++] = this;
        }
    }
}

Bar1.hpp:

#include "Foo.hpp"

class Bar1 : public Foo
{
public:
    Bar1() : Foo() { }
}

Bar2.hpp:

#include "Foo.hpp"

class Bar2 : public Foo
{
public:
    Bar2() : Foo() { }
}

Globals.cpp:

#include "Bar1.hpp”
#include "Bar2.hpp"

static Bar1 bar1;
Foo & foo1 = bar1;

static Bar2 bar2;
Foo & foo2 = bar2;

Export.hpp:

#include "Foo.hpp"

extern Foo & foo1;
extern Foo & foo2;

Вот мои вопросы:

  1. Если проект, включающий мою библиотеку, использует только foo1,тогда foo2 будет удален из окончательного двоичного файла?И, таким образом, код для класса Bar2 также будет удален?

  2. Если нет, знаете ли вы, как я могу реструктурировать свой код так, чтобы неиспользуемые символы и неиспользуемый код были удаленыво время ссылки?Я могу думать только о том, чтобы переместить Globals.cpp и Export.hpp в проект, включающий мою библиотеку.Есть ли другой способ?

  3. Один из способов, который я могу придумать, - это переместить разбиение Globals.hpp и Export.hpp на более мелкие файлы с группами объявлений и определений, которые имеют смысл вместе.Это поможет?

...