【问题标题】:Single function interface using struct for in/out parameters使用结构输入/输出参数的单函数接口
【发布时间】:2015-07-01 14:08:48
【问题描述】:

我想用一个带有 ID 和参数结构的函数创建一个函数接口。 在内部,调用函数并将结构中的参数传递给函数。返回值被传递给结构中的指针。 这个设计有哪些陷阱?有什么比 switch-case 语句更快的方法吗?

enum Id{ CALL_1, CALL_2};
struct PARM_1 { int parm1; int parm2; void* data};
struct PARM_2 { int parm1; int* parm2};

void function(int id, void* parm)
{
  switch (id)
  {
   case CALL_1:
   {
    PARM_1* p = (struct PARM_1*) parm;
    function_1(p->parm1, p->parm2, parm->data); 
    break;
   }
  case CALL_2:
   {
    PARM_2* p = (struct PARM_2*) parm;
    function_2(p->parm1, p->parm2);
    break;
   }
  default:
    break;
}

}

void foo(int parm1, int parm2, void data); void barint parm1, int parm2);

【问题讨论】:

  • 请编辑帖子并修正缩进。并确保您的代码编辑器设置为不使用制表符缩进,而是插入空格。
  • 不需要从void* 进行转换。

标签: c


【解决方案1】:

首先,进行手动优化的标准经验法则。一般来说,手动代码优化没有多大意义,除非:

  • 您对代码进行了基准测试,发现其中的某个部分是瓶颈。
  • 您已经考虑了给定的硬件。
  • 您是给定硬件的专家。

话虽如此,C 程序员始终必须确保他们不会编写编译器无法很好地处理的愚蠢低效的东西。例如复杂的嵌套循环结构、复杂的嵌套 if-else、复杂的函数调用、递归等。


在这种特定情况下,代码看起来不错,但您实际上无法提高性能。

像这样的 switch-case 基于具有相邻数字的枚举,是优化器的理想选择。编译器可以将其优化为一个函数指针数组,每个函数指针对应一个case。或者直接跳转地址数组。

这并不是 C 程序员真正需要关心的事情,但他们可能需要考虑,每个整数大小写都是相邻数字的开关可能比任何随机数的开关得到更好的优化。

在这种情况下,唯一的优化问题可能是分支预测。但是由于您使用不同的函数签名,因此没有办法避免它。如果您可以重写函数以使用相同的签名,则可以稍微优化该函数。但我们在这里讨论的是纳秒。

【讨论】:

    猜你喜欢
    • 2011-06-09
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 2013-11-07
    相关资源
    最近更新 更多