gpt4 book ai didi

关于在 C 中处理具有相同签名的多个函数的代码质量问题

转载 作者:行者123 更新时间:2023-11-30 19:25:15 26 4
gpt4 key购买 nike

我的程序对传入消息进行应答,并根据消息中包含的 ID 和数据执行一些逻辑。
我对每个ID都有不同的功能。
该项目是纯C语言。

为了使代码易于使用,我将所有函数调整为相同的样式(相同的返回值和参数)。
我还想避免冗长的 switch-case 结构并使代码更易于以后编辑,因此我创建了以下函数:

AnswerStruct IDHandler(Request Message)
{
struct AnswerStruct ANS;
SIDHandler = IDfunctions[Message.ID];
ANS = SIDHandler(Message);
return ANS;
}

AnswerStruct 是应答消息的结构。
请求是传入消息的结构。
IDfunctions 是指向函数的指针数组,如下所示 -

AnswerStruct func1(Request);
AnswerStruct func4(Request);
...

typedef AnswerStruct(*f)(Request);
AnswerStruct (*SIDHandler)(Request);

static f IDfunctions[IDMax] = {0, *func1, 0, 0, *func4, ...};

放置在数组单元格中的函数指针等于其 id,例如:
func1 与 ID=1 的消息相关。
func4 与 ID=4 的消息相关。

我认为,通过使用这个数组,我的生活变得更加轻松。
我可以一步调用我需要的函数(只需转到 IDfunctions[ID])。
此外,添加新函数变成了两步操作(只需将函数添加到 ID 函数并编写逻辑)。

我怀疑所选解决方案的效率,它对我来说似乎很笨重。
问题是 - 这是一个好的架构吗?
如果不是,我该如何编辑我的解决方案以使其更好?
谢谢。

最佳答案

I doubt the efficiency of the selected solution, it seems clunky to me.

通过函数指针调用函数比直接通过名称调用函数的效率可能要低,因为前者剥夺了编译器优化调用的任何机会。但你必须考虑这是否真的重要。在基于从外部源接收的消息调度函数调用的系统中,接收消息所涉及的 I/O 可能比间接函数调用昂贵得多,因此调用性能的差异不太可能很大。

另一方面,您的方法提供了更简单的逻辑和更少的代码行,这是一种不同且可能更有值(value)的效率。

The question is - Is this a good architecture?

总体方法非常好,在提供的实现草图中我没有看到太多可提示的地方。

就个人而言,我会将数组 IDFunctions 声明为 const (当然,假设您不打算在初始化后替换其任何成员),但这只是一个次要的安全/性能细节,性能维度可能与此无关。

关于关于在 C 中处理具有相同签名的多个函数的代码质量问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59138320/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com