![]() |
1
1
在我谈到节省内存之前,有一点很重要。你凌驾于
我真的有点惊讶于这个错误
在扫描器分配4个字节来存储指向新创建的缓冲区状态对象的指针之后,它继续分配缓冲区状态本身(大约40个字节),然后分配缓冲区。缓冲区(通常)是16378字节(加上两个额外字节,总共16380字节),对于一台只有256k内存的机器来说,这是相当大的一部分。这就是你要关注的部分。 实际上,很少需要这么大的缓冲区,特别是因为扫描仪通常可以在需要时重新分配缓冲区。缓冲区需要比您希望解析的最大单个令牌大一点;尽管对于交互式程序,它可能有助于保持足够长的时间来容纳一行输入。默认设置对于需要处理长注释和字符串常量的编译器很有帮助,但对于您的应用程序,使用更小的缓冲区可能就足够了。 减少缓冲区大小有两种基本方法。简单的方法是在prolog中定义一个宏:
那你就可以用普通的
虽然这很简单,但不是最有效的。一次读取一个字符(或者一次读取几个字符)会导致大量的重新扫描,而且内核队列机制会增加一些开销,这些都不是必需的。假设您的协议消息明确地以换行符终止(即,每条消息都以换行符终止,每条换行符终止一条消息),那么更有效的解决方案是将一行输入累积到您自己的缓冲区中,您可以直接从串行端口执行此操作,然后解析缓冲区中的整行。 您需要记住的一点是,flex缓冲区必须以 二 NUL字节。因此,输入缓冲区需要比预期能够处理的最长协议消息长两个字节。 结果可能是这样的:
对…的呼唤
缓冲区本身既不是malloc'd也不是free'd,因为它是您的缓冲区。它也不会再装满,所以你可以定义
|
![]() |
Kris · Flex-新行无法识别 7 年前 |
![]() |
omn_1 · yylineno为错误报告提供意外结果 7 年前 |
![]() |
Juan Torres · Flex:匹配有符号整数与加法/减法 9 年前 |
![]() |
mljli · flex正则表达式使用带有尾随上下文的{-} 9 年前 |
![]() |
TreeTree · lex和yacc的运行时“语法错误” 12 年前 |