避免在函数调用之间传递大数据

时间:2015-01-04 15:18:32

标签: c pointers memory-management

我是C的新手,所以请耐心等待。我正在编写一个解析器来打开多个文本文件 - 每个大约300 Kb,逐个字符地读取它们并提取所需的信息。处理有三个不同的阶段,它需要大约十个不同的函数来处理每个字符串块,一个接一个。

由于文件不是很小,而且可能有很多文件,我正在尝试编写一个高效且符合行业标准的代码。

对我而言,似乎这些是我的选择:

A)嵌套函数调用:让我的main函数调用read_file,然后read_file调用get_lines,然后{{1} }调用get_lines等等。

这个解决方案的优点是,如果我的get_name函数中有一个while循环,那么直接和循环内部我可以调用read_file函数;但是,如果我将数据从get_name函数返回到get_lines,那么我必须再次遍历它并将数据传递给main

虽然这里的问题是它不是一种有组织的做事方式。在这种情况下,我的main函数只调用get_name函数,然后将输出数据写入文件。

我想read_file函数应该控制程序的整体执行,这意味着它应该调用一个函数来做一些业务逻辑,然后检索数据并将其传递给下一个函数,依此类推。我在这里还是错误的假设?

B)全局变量:这样我将定义几个全局变量,然后我将只处理它们而无需将它们从此函数传递给另一个功能。

由于它不需要在函数生命结束时返回数据,因此它必须更高效;但是,即使在静态类型和同步环境中,我也不是 Global Variables 的忠实粉丝。我可能会不必要地担心它。

C)传递指针:对我来说,这似乎是我应该采取的方式;然而,由于这些数据是函数范围的本地数据,因此我将会出现 Wild Pointers main关键字解决了无效指针的问题;然而,似乎更有经验的人试图避免出于某种原因使用它。所以我不太确定这是不是一个好习惯。

问题:我在static没有任何实际经验,因此我看不出上述解决方案的真正优缺点。例如,使用C关键字并传递指针是否比使用全局变量更有优势?

换句话说,在这个特定情况下,每种方法的优缺点清单肯定会帮助我选择三分之一。

1 个答案:

答案 0 :(得分:1)

对于问题,全局ans局部静态变量的行为方式相同。它们都算作全球性的'为了特定的功能,end因此不能同时从多个调用中使用(从多个并发线程调用)。

要回答这个问题,需要了解此代码的要求和最终目标。

某些任务需要最终的数据集 - 这将随着较大的文件而增长,但在使用之前仍需完整。例如,您可以考虑文件(或文件集)中的唯一单词列表。

其他任务允许迭代方法 - 您可以多次调用函数,每次都检查返回值并对其进行处理。某些特定的返回值表示没有更多数据,您应该在此时停止调用它。示例是文件读取功能,如fread - 您多次调用它,并且每次从上次停止的位置继续读取它。同样的任务可以完成形成完整的数据集 - 比如根据需要分配尽可能多的内存并将整个文件读入其中;它是完全不同的,不太灵活的方法。然而,某些更高级别的任务可能需要它,即处理数据的任务。

某些任务允许两种方法,例如XML解析可以是DOM或SAX。但仍有一个更高级别的目标决定使用哪种方法(DOM可能更容易使用,但如果数据是从慢速源获取的,例如互联网,则需要SAX,而需要至少显示部分数据虽然尚未完全加载。)