【问题标题】:Disadvantage of using a struct as a c "namespace"将结构用作 c“命名空间”的缺点
【发布时间】:2018-01-12 19:36:17
【问题描述】:

我经常将一组相关的全局函数和变量包装在一个结构中,为它们创建一种“命名空间”,例如

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 成为伪 OOL 的意义何在?
  • 顺其自然,写出惯用的代码。在出现名称冲突问题时处理它们。他们几乎从不这样做。
  • @PeterJ 就我个人而言,我只是喜欢在我的程序中拥有更多的控制权和透明度,而且通常 c 会创建更小的可执行文件。但是c/c++的争论之前已经发生过很多次了,我不知道这里讨论的那么重要
  • 一些开销是不可避免的,因为代码必须在每次运行时解析一个引用。但是考虑到您的观点,我建议使用预处理器在编译时移动开销并避免在运行时造成任何性能损失。 IE。定义一个宏 #define ns(namespace, object) namespace##_##object 将在对象名称前加上命名空间和下划线,在运行时不需要做任何工作。
  • @JohnBollinger 这种方法会使这些事情变得更加困难吗?如果可以,你能详细说明吗?

标签: c struct namespaces global-namespace


【解决方案1】:

由于结构对齐而分配了更多内存(更多信息here)。结构实例将具有其最宽标量成员的对齐方式。

【讨论】:

  • 详细信息:“具有其最宽标量成员的对齐方式。” --> 不是成员的宽度,是成员的对齐需求。该链接支持您的观点作为概括,而不是要求。
【解决方案2】:

将结构用作 c“命名空间”的缺点

增加碰撞可能性。

这里的想法是使用foo.afoo.xfoo.bar(),而不是使用foo_afoo_xfoo_bar()。现在的问题是 foo 与任何其他 3 个字符 foo 对象/函数发生冲突。

前缀 foo_ 方法需要 5+ 个字符匹配才能发生冲突。 IOWs,虽然 OP 的想法确实组织了对象和函数,但它增加了碰撞机会。

【讨论】:

    猜你喜欢
    • 2023-04-10
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    相关资源
    最近更新 更多