使用结构体作为c语言“命名空间”的缺点

3

我经常会把一组相关的全局函数和变量封装在一个结构体中,以创建一个类似于它们的“命名空间”,例如:

extern struct foo_namespace {
    int (* const foo)(int a);
    int (* const bar)(void);
    const int a;
    const int b;
    int x;
    int y;
} foo;

然后将其与一个设置函数和常量的.c文件链接起来。
这样,我就可以创建全局名称而不必担心命名空间中的内容以及稍后会出现什么情况,非常干净和方便。
然而,我确实担心它通过要求通过指针调用函数来引入一小部分代码的低效性,可能还有其他问题。
无论是程序设计、速度、可执行文件大小还是其他任何问题,对于以这种方式分组全局变量的所有潜在问题和低效性都有哪些?
编辑: 我刚刚运行了一个带有结构体中空函数和常规函数的循环。当没有应用优化时,结构体中的函数更快(20秒对26秒)。经过优化后,全局函数被完全优化掉,速度更快。看来除非函数可以内联,否则速度上并不重要。

那么为什么不用C++编程呢?将C变成伪面向对象语言的尝试有何意义? - 0___________
@PeterJ 就我个人而言,我喜欢在我的程序中拥有更多的控制和透明度,此外通常情况下,C语言可以创建更小的可执行文件。然而,C/C++之争已经发生了很多次,我不知道在这里讨论它是否那么重要。 - rtpax
但是你的程序不透明且难以阅读。当我开始学习C++时,我也有同样的看法,相信我,如果C++不如C有效,我主要从事裸机嵌入式编程,我绝不会碰C++。 - 0___________
1
一些开销是不可避免的,因为代码必须在运行时每次解析引用。但考虑到您的观点,我建议使用预处理器将开销移动到编译时,并避免在运行时出现任何性能损失。即定义一个宏 #define ns(namespace, object) namespace##_##object 将对象名称前缀与命名空间和下划线一起,而无需在运行时进行任何操作。 - Frankie_C
1
@JohnBollinger,这种方法会使这些事情变得更加困难吗?如果是的话,您能详细说明一下吗? - rtpax
显示剩余12条评论
2个回答

2

由于结构对齐,会分配更多的内存(更多信息请参见此处)。结构实例的对齐方式取决于其最宽的标量成员。


1
细节:“具有其最宽标量成员的对齐方式。” --> 这不是成员的宽度,而是成员需要的对齐方式。该链接支持您的观点作为一种“概括”,而不是要求。 - chux - Reinstate Monica

0
使用结构体作为C语言“命名空间”的缺点是增加了冲突的可能性。
这里的想法是使用foo.afoo.xfoo.bar(),而不是foo_afoo_xfoo_bar()。问题在于现在foo与任何其他3个字符的foo对象/函数发生冲突。
前缀foo_方法需要5个或更多字符匹配才会发生冲突。换句话说,尽管OP的想法确实组织了对象和函数,但它增加了冲突的可能性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接