4

我的工作是为一些没有虚拟内存的绝对古老的硬件开发代码。正因为如此,我们试图尽量减少对象和二进制文件的文本大小,所以我们不会耗尽内存。这可能意味着我们需要限制使用来自 STL 的模板,或者彻底禁止它们。在四处寻找一种最小化文件大小并仍然使用模板的方法时,我遇到了-frepog++ 的选项。几次测试之后,我比开始时更加困惑。当使用 -frepo 时,最终的二进制文件大小相同或更大,这对我来说没有意义。谁能向我解释这个选项实际上做了什么(除了“它只是工作”,因为这是 GCC 4.7.1 手册中的解释)以及我可能如何滥用它?

正在编译g++ -c -frepo main.cpp test8.cpp和链接g++ test8.o main.o .rpo 文件正在创建中。

测试8.h:

#include <list>
using namespace std;

class Test
{
  public:
    Test ();
    list<int> makeNewIntList ();
  private:
  list<int> intList;
};

测试8.cpp:

#include "test8.h"
#include <list>

using namespace std;

Test::Test()
{
  intList = list<int>( 10, 12 );
}

list<int> Test::makeNewIntList()
{
  intList.push_back(4);
  return intList;
}

主文件

#include "test8.h"

using namespace std;

void findFive (int num);
list<int> makeIntList();

int main( int argc, char* argv[])
{
  Test test;
  list<int> intList = test.makeNewIntList();
  list<int> intList2 = makeIntList();
  list<float> floatList = list<float> (10,12);
  floatList.push_back(5);
}

list<int> makeIntList()
{
  list<int> intList = list<int> (10,12);
  return intList;
}

我们正在使用 GCC 4.1.2。另请注意,GCC 4.7.0 也好不到哪里去,升级编译器不是一个可行的解决方案。

4

1 回答 1

5

我建议你忘记-frepo它,它是一个遗物,很少使用。

相反,您可以查看extern template声明显式实例化的语法,以防止模板被隐式实例化,从而允许您控制实例化,使它们只发生在一个地方。为了确保你不会错过任何你也可以编译的东西-fno-implicit-templates(如果你严格要求在extern template任何必要的地方使用声明,这不是必需的。)

于 2012-08-06T16:55:20.227 回答