私は現在、特にデバッグ中に STL コンテンツを印刷するために、STL についていくつかの調査を行っています。私は多くの異なるアプローチがあることを知っています。
お気に入り:
- http://sourceware.org/gdb/wiki/STLSupport
- または共有ライブラリを使用してコンテナーのコンテンツを印刷する
私が現在探しているのは、g ++が使用されていない関数を削除する理由です。たとえば、次のコードがあり、コンパイル設定を使用していますg++ -g main.cpp -o main.o
。
include <vector>
include <iostream>
using namespace std;
int main() {
std::vector<int> vec;
vec.push_back(10);
vec.push_back(20);
vec.push_back(30);
return;
}
したがって、このコードをデバッグすると、使用できないことがわかりますprint vec.front()
。私が受け取るメッセージは次のとおりです。
Cannot evaluate function -- may be inlined
したがって、設定を使用しようとしました-fkeep-inline-functions
が、変更はありません。
使用するnm main.o | grep front
と、メソッドの行エントリがないことがわかります.front()
。同じことをもう一度行いますがvec.front()
、コード内に追加のエントリを使用して、エントリが表示される場所をprint vec.front()
使用して使用できますnm main.o | grep front
0000000000401834 W _ZNSt6vectorIiSaIiEE5frontEv
すべての関数を失わずにコード内に保持する方法を誰かに説明してもらえますか? 私は、最適化設定を設定したり、以下を実行したりしない限り、デッド関数は削除されないと思います。
必要な理由: 現在の Python 実装では、内部 STL 実装を使用してコンテナーのコンテンツを出力しますが、ISO/IEC 14882 で定義されている関数を使用する方がはるかに興味深いでしょう。共有ライブラリを作成できることはわかっています。デバッグする前に実際のコードにコンパイルして、すべての STL 関数があることを維持できますが、デバッグする前に追加の lib をそのコードにコンパイルしたい場合。この 2 つのアプローチ (Shared Lib. と Python) の長所と短所があるかどうかを知ることも興味深いでしょうか?