将结构用作c的缺点;名称空间;
例如,我经常将一组相关的全局函数和变量包装在一个结构中,为它们创建一种“名称空间”将结构用作c的缺点;名称空间;,c,struct,namespaces,global-namespace,C,Struct,Namespaces,Global Namespace,例如,我经常将一组相关的全局函数和变量包装在一个结构中,为它们创建一种“名称空间” 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文件链接 这使我可以创建全局名称,而不用担心名称空间中有什么以及以后会有什么,它
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“命名空间”的缺点 增加碰撞的可能性 这里的想法是使用
foo.a
,foo.x
和foo.bar()
与可能的foo.a
,foo.x
,foo.bar()
。现在的问题是foo
与任何其他3个字符foo
对象/函数冲突
前缀
foo_
方法需要5个以上字符的匹配来进行碰撞,虽然OP的思想确实组织了对象和函数,但是它增加了碰撞的机会。为什么你不在C++中编程?尝试将C变成伪工具的目的是什么?只需按照流程编写惯用代码即可。处理出现的名称冲突问题。“他们几乎从来没有这样做过。”@PeterJ个人认为,我只是喜欢在我的程序中有更多的控制和透明度,而且通常c会创建更小的可执行文件。然而,c/c++的争论以前已经发生过很多次了,我不知道在这里讨论有多重要一些开销是不可避免的,因为代码必须在每次运行时解析一个引用。但是考虑到你的观点,我建议使用预处理器来减少编译时的开销,避免运行时的性能损失。例如,定义一个宏#define ns(名称空间,对象)名称空间#####对象
将在对象名称前面加上名称空间和下划线,而在运行时不需要做任何工作。@JohnBollinger这种方法会使这些事情更加困难吗?如果是这样,您可以详细说明吗?详细信息:“对其最宽的标量成员进行对齐。”-->这不是成员的宽度,而是成员的对齐需求。该链接支持将您的观点作为一种概括,而不是一种要求。