4

私の職場では、仮想メモリを持たない完全に古いハードウェアのコードを開発しています。このため、メモリ不足にならないように、オブジェクト ファイルとバイナリ ファイルのテキスト サイズを最小限に抑えるように注意を払っています。これはおそらく、STL からのテンプレートの使用を制限するか、完全に禁止する必要があることを意味します。ファイルのサイズを最小限に抑えながらテンプレートを使用する方法を探しているときに、-frepog++ のオプションを見つけました。いくつかのテストの後、私は始めたときよりもさらに混乱しています. -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 はそれほど優れているわけではなく、コンパイラのアップグレードは実行可能な解決策ではないことに注意してください。

4

1 に答える 1

5

私はあなたが忘れることをお勧めします-frepo、それは遺物であり、ほとんど使用されていません。

代わりに、extern template明示的なインスタンス化を宣言するための構文を調べて、テンプレートが暗黙的にインスタンス化されるのを防ぎ、インスタンス化を1か所でのみ発生するように制御できるようにすることができます。コンパイルすることもできるものを見逃さないようにするために(必要な場所で宣言-fno-implicit-templatesを使用することに厳密な場合は必要ありません)。extern template

于 2012-08-06T16:55:20.227 に答える