我目前正在对 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 功能,但谁想在调试之前为其代码编译一个额外的库。知道这两种方法(共享库和 Python)是否有一些优点和缺点也会很有趣?