【问题标题】:Run-time codepaths without function pointers in C?C 中没有函数指针的运行时代码路径?
【发布时间】:2016-02-26 05:00:22
【问题描述】:

我知道这可能不是一个真正的问题。但是我在这里查看我开始编写的新代码并且想知道一些事情。

我必须编写通常需要在多个平台上运行的代码。我总是以两种方式处理这个问题。

当存在足够大的平台差异以致几乎要进行完整的代码重写时,我会为这些平台的模块提供单独的目录,其中包含所述平台代码,并根据平台从目录中编译源代码。

例如:

|-- module_a
|-- module_b
|   |-- linux
|   |-- osx
|   `-- windows
`-- module_c

Makefile 将从与平台无关的 module_b 和 module_b/[os]/ 代码中调用源代码,具体取决于平台。

这一切都很好而且很酷,除非不需要重写那么多代码。那么,这往往会导致大量的复制/粘贴,我倾向于避免这种情况,因为它会导致错误,坦率地说,感觉很笨拙。

第二个变体也与我有时需要优化和未优化版本(不要问)相同代码和类似情况的问题重叠。这让我想到了函数指针。

这是第二个问题解决方案,也可以正常工作。但是,我知道函数指针可能会导致编译器在优化代码时遇到问题。

我的新代码将包含很多这样的代码,所以我提前想知道,是否有第三种可能性让运行时代码路径对编译器(可能还有 cpu?)友好?

请注意,我完全避免为此使用#ifdefs。 如果重要的话,我在所有三个平台(是的,甚至是 OSX)上使用 gcc 5.2(和快照)在 C99 中编程。所以我也对扩展持开放态度。

PS 我曾多次尝试programmers.stack,但遗憾的是,它是一座鬼城。

【问题讨论】:

  • 请不要批评其他无法为问得不好的问题提供答案的平台。你认为我们是谁,某种神谕?您事先尝试编写的代码在哪里?
  • 为什么要避免#ifdef?对于可以静态确定的东西,这是最好的方法。
  • @Adam #ifdefs 或多或少与我对条件生成文件所做的事情相同,因此在我的情况下它们是不必要的。也许避免不是正确的词。不使用更喜欢它。它不会取代函数指针提供的运行时重新配置需求。
  • 恐怕我没有完全关注你。为什么平台抽象需要运行时调度?如果您需要切换一个可选的未优化实现,比如因为快速路径依赖于不可用的 CPU 指令,那么您可以随意这样做,但在典型的操作系统可移植性情况下,您通常最好直接为每个支持的平台实现该功能。如果周围仍然有很多共享代码,则将其分流给共享助手或其他什么,或者如果差异很小,则使用#ifdef
  • @WeatherVane 在我被重定向到那个站点之前我是先发制人的。如果需要关闭问题,那就这样吧。还没有新代码库的代码 - 我正在查看我在过去项目中编写的内容,并且正面临一项我需要完成的新任务,并且想知道我现在是否可以完全避免使用函数指针。更像是一个规则,如果你愿意的话,填充它们的结构就像一个 API。

标签: c optimization c99


【解决方案1】:

如果可以为每个平台编译单独的二进制文件,则无需为不同平台进行任何运行时代码路径切换。

仅当您为多个硬件(显然基于相同的处理器)构建相同的映像并使用在运行时选择的不同模块对其进行配置时,才需要用于平台支持的运行时控制流。这允许一个模块以几种不同的形式出现,但可以使用普通的全局函数调用来调用,而不是通过函数指针间接调用。

【讨论】:

  • 好的,但是如何在运行时使用普通的全局函数调用在没有函数指针的情况下配置和选择模块/代码?假设 .so/.dll 不是一个选项
  • 你不会的。 运行时间之前,您需要一些脚本将这些部分链接在一起以制作图像(给定系统板的正确图像或其他)。
猜你喜欢
  • 1970-01-01
  • 2021-10-07
  • 2022-06-21
  • 1970-01-01
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 2014-05-02
相关资源
最近更新 更多