使用LLVM LTO剥离静态全局对象

时间:2019-05-22 19:08:43

标签: c++ clang compiler-optimization lto

我正在研究一个链接到多个二进制文件的静态库。我的目标是减少链接到我的库时的内存占用。

我的图书馆用户需要我在我的图书馆的cpp文件中创建的某些全局对象,然后导出具有这些变量的外部声明的头文件。

问题是,取决于库的使用方式,某些全局变量可能根本无法使用。

以下代码稍微显示了我的代码结构:

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拆分成较小的文件,这些文件具有一起有意义的声明和定义组。那会帮助吗?

0 个答案:

没有答案