避免在函数调用之间传递大数据
Avoid passing large data between function calls
我对 C
完全陌生,所以请多多包涵。我正在编写一个解析器来打开多个文本文件——每个大约 300 Kb,逐个字符地读取它们并提取所需的信息。处理分为三个不同的阶段,它需要大约十个不同的函数来处理每个字符串块,一个接一个。
由于文件不是很小而且可能有很多,我正在尝试编写一个高效且符合行业标准的代码。
对我来说,这些是我的选择:
A) 嵌套函数调用: 假设我的 main
函数调用 read_file
,然后 read_file
调用 get_lines
,然后 get_lines
调用 get_name
等等。
这个解决方案的优点是,如果我在 read_file
函数中有一个 while
循环,那么我可以直接在循环内调用 get_name
函数;但是,如果我 return 从 get_lines
函数到 main
的数据,那么我必须再次遍历它并将数据传递给 get_name
例如。
这里的问题是它不是一种很有条理的做事方式。在这种情况下,我的主函数只会调用 read_file
函数,然后最后将输出数据写入文件。
我猜 main
函数应该控制程序的整体执行,这意味着它应该调用一个函数来执行一些业务逻辑,然后检索数据并将其传递给下一个函数等等上。我在这里还是错误的假设?
B) 全局变量: 这样我将定义几个 全局变量 然后我将在不需要的情况下处理它们用于将它们从这个函数传递到另一个函数。
既然在函数的生命周期结束时不需要returning数据,那么效率肯定更高;然而,我不是 全局变量 的忠实粉丝,即使在静态类型和同步环境中也是如此。不过,我可能会不必要地担心它。
C) 传递指针: 对我来说,这似乎是我应该去做的方式;但是,由于这些数据在函数范围内是本地的,因此我将使用 Wild Pointers。 static
关键字解决了无效指针的问题;然而,似乎更有经验的人出于某种原因试图避免使用它。所以我不太确定这是否是一个好习惯。
问题:我在C
方面没有任何实际经验,因此我看不出上述解决方案的真正优缺点是什么.例如,与使用全局变量相比,使用 static
关键字并传递指针是否给我任何优势?
换句话说,在这个具体案例中,每种方法的优缺点的简短列表肯定会帮助我三选一。
就问题而言,全局和局部静态变量的行为方式相同。为了特定的功能,它们都算作 'global',因此不能同时从许多调用(从多个并发线程调用)中使用 end。
要回答这个问题,需要了解此代码的要求和最终目标。
有些任务需要最终数据集作为结果——这些数据会随着文件的增加而增长,但在使用之前仍然必须完成。作为示例,您可以想到文件(或文件集)中的唯一单词列表。
其他任务允许迭代方法 - 您可以多次调用函数,每次检查 return 值并处理它。一些特定的 return 值表示没有更多数据,此时您应该停止调用它。示例是文件读取函数,如 fread
- 你多次调用它,每次它都从上次停止的地方继续读取。同样的任务 可以 通过形成完整的数据集来完成——比如根据需要分配尽可能多的内存并将整个文件读入其中;这是完全不同的,不太灵活的方法。但是,某些更高级别的任务(处理数据的任务)可能需要它。
有些任务允许两种方法,例如XML 解析可能是 DOM 或 SAX。但是,仍然有一个更高级别的目标决定使用哪种方法(DOM 可能更容易使用,但如果数据是从慢速源(例如互联网)获取的,则首选 SAX,同时需要显示至少部分数据尚未完全加载)。
我对 C
完全陌生,所以请多多包涵。我正在编写一个解析器来打开多个文本文件——每个大约 300 Kb,逐个字符地读取它们并提取所需的信息。处理分为三个不同的阶段,它需要大约十个不同的函数来处理每个字符串块,一个接一个。
由于文件不是很小而且可能有很多,我正在尝试编写一个高效且符合行业标准的代码。
对我来说,这些是我的选择:
A) 嵌套函数调用: 假设我的 main
函数调用 read_file
,然后 read_file
调用 get_lines
,然后 get_lines
调用 get_name
等等。
这个解决方案的优点是,如果我在 read_file
函数中有一个 while
循环,那么我可以直接在循环内调用 get_name
函数;但是,如果我 return 从 get_lines
函数到 main
的数据,那么我必须再次遍历它并将数据传递给 get_name
例如。
这里的问题是它不是一种很有条理的做事方式。在这种情况下,我的主函数只会调用 read_file
函数,然后最后将输出数据写入文件。
我猜 main
函数应该控制程序的整体执行,这意味着它应该调用一个函数来执行一些业务逻辑,然后检索数据并将其传递给下一个函数等等上。我在这里还是错误的假设?
B) 全局变量: 这样我将定义几个 全局变量 然后我将在不需要的情况下处理它们用于将它们从这个函数传递到另一个函数。
既然在函数的生命周期结束时不需要returning数据,那么效率肯定更高;然而,我不是 全局变量 的忠实粉丝,即使在静态类型和同步环境中也是如此。不过,我可能会不必要地担心它。
C) 传递指针: 对我来说,这似乎是我应该去做的方式;但是,由于这些数据在函数范围内是本地的,因此我将使用 Wild Pointers。 static
关键字解决了无效指针的问题;然而,似乎更有经验的人出于某种原因试图避免使用它。所以我不太确定这是否是一个好习惯。
问题:我在C
方面没有任何实际经验,因此我看不出上述解决方案的真正优缺点是什么.例如,与使用全局变量相比,使用 static
关键字并传递指针是否给我任何优势?
换句话说,在这个具体案例中,每种方法的优缺点的简短列表肯定会帮助我三选一。
就问题而言,全局和局部静态变量的行为方式相同。为了特定的功能,它们都算作 'global',因此不能同时从许多调用(从多个并发线程调用)中使用 end。
要回答这个问题,需要了解此代码的要求和最终目标。
有些任务需要最终数据集作为结果——这些数据会随着文件的增加而增长,但在使用之前仍然必须完成。作为示例,您可以想到文件(或文件集)中的唯一单词列表。
其他任务允许迭代方法 - 您可以多次调用函数,每次检查 return 值并处理它。一些特定的 return 值表示没有更多数据,此时您应该停止调用它。示例是文件读取函数,如 fread
- 你多次调用它,每次它都从上次停止的地方继续读取。同样的任务 可以 通过形成完整的数据集来完成——比如根据需要分配尽可能多的内存并将整个文件读入其中;这是完全不同的,不太灵活的方法。但是,某些更高级别的任务(处理数据的任务)可能需要它。
有些任务允许两种方法,例如XML 解析可能是 DOM 或 SAX。但是,仍然有一个更高级别的目标决定使用哪种方法(DOM 可能更容易使用,但如果数据是从慢速源(例如互联网)获取的,则首选 SAX,同时需要显示至少部分数据尚未完全加载)。