在G ++中使用-frepo选项

时间:2012-08-06 16:43:36

标签: c++ templates g++

我的工作地点是为一些没有虚拟内存的绝对古老硬件开发代码。因此,我们试图小心地最小化对象和二进制文件的文本大小,因此我们不会耗尽内存。这可能意味着我们需要限制STL模板的使用,或者直接禁止它们。在环顾四周找到最小化文件大小的方法时,仍然使用模板,我遇到了g ++的-frepo选项。稍后进行一些测试,我比开始时更加困惑。当使用-frepo时,最终的二进制文件大小相同或更大,这对我来说没有意义。任何人都可以向我解释这个选项实际上做了什么(除了“它只是工作”,因为这是GCC 4.7.1手册中的解释)以及我如何滥用它?

使用g++ -c -frepo main.cpp test8.cpp进行编译并与g++ test8.o main.o相关联 正在创建.rpo文件。

test8.h:

#include <list>
using namespace std;

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

test8.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;
}

的main.cpp

#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并不是更好,升级编译器不是一个可行的解决方案。

1 个答案:

答案 0 :(得分:3)

我会建议你忘掉-frepo,这是遗物而且几乎没用过。

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