我正在使用linux perf分析C++应用程序,我正在使用GProf2dot获得一个很好的控制流程图.但是,来自C库(libc6-2.13.so)的一些符号占用了总时间的很大一部分,但没有内边缘.
例如:
_int_malloc 需要8%的时间,但没有电话父母.__strcmp_sse42和__cxxabiv1::__si_class_type_info::__do_dyncast一同来的时间约10%,并有来电者的名字是0,它有来电2d6935c,2cc748c和6,其中有没有来电.结果,我无法找到哪些例程负责所有这些mallocing和动态转换只使用perf.但是,似乎其他符号(例如malloc但不是_int_malloc)确实有呼叫父母.
为什么没有为_int_malloc显示呼叫父母?为什么我找不到__do_dyn_cast的最终来电者?并且,有什么方法可以修改我的设置,以便我可以获取此信息吗?我在x86-64上,所以我想知道我是否需要带有帧指针的(非标准)libc6.
假设您的语言标识符可能以关键字开头.例如,假设"case"是关键字,但"caser"是有效的标识符.还假设词法分析器规则只能处理正则表达式.然后似乎我不能在词法分析器中的标识符规则之前放置关键字规则,因为这会将"caser"解析为"case"后跟"r".我也不能在标识符规则之后放置关键字lexing规则,因为标识符规则将匹配关键字,并且关键字规则永远不会触发.
因此,相反,我可以在词法分析器中创建keyword_or_identifier规则,并让解析器确定keyword_or_identifier是关键字还是标识符.这是通常做的吗?
我意识到"使用具有前瞻性的不同词法分析器"是一种答案(某种程度),但我也对如何在传统的基于DFA的词法分析器中完成这一操作感兴趣,因为我当前的词法分析器似乎是这样的.
在下面的函数中,我尝试通过查看是否可以读取类型以及之后是否完全消耗输入来查看字符串s是否可转换为类型.我想要TT
template <class T>
bool can_be_converted_to(const std::string& s, T& t)
{
std::istringstream i(s);
i>>std::boolalpha;
i>>t;
if (i and i.eof())
return true;
else
return false;
}
Run Code Online (Sandbox Code Playgroud)
但是,can_be_converted_to<bool>("true")计算结果为false,因为i.eof()在函数结束时为false.
这是正确的,即使功能已经阅读整个字符串,因为它并没有试图看过去的字符串的结尾.(所以,显然这个函数适用于int和double,因为istringstream在阅读这些函数时会读到结尾.)
所以,假设我确实应该检查(i and <input completely consumed>):
问:如何使用eof()检查输入是否完全消耗?
它看起来像调用boost::any_cast<T>(any&)一些昂贵的类型检查以确保转换有效.具体来说,它调用执行以下测试以确保演员合法:
std :: strcmp(operand-> type().name(),typeid(ValueType).name())== 0
如果强制转换是合法的,则代码执行static_cast.
这对于调试模式似乎很有用,但对于生产代码来说却相当慢.有没有办法跳过strcmp?