c++ - 类似 C 的回调处理 : which algorithm preforms faster?

标签 c++ c callback

我有一组像这样的回调 void (*callbacks[n])(void* sender) 我想知道这些代码中哪一个执行得更快:

//Method A
void nullcallback(void* sender){};

void callbacka(void* sender) 
{
    printf("Hello ");
}

void callbackb(void* sender)
{
    printf("world\n");
}

int main()
{
    void (*callbacks[5])(void* sender);
    unsigned i;
    for (i=0;i<5;++i)
        callbacks[i] = nullcallback;
    callbacks[2] = callbacka;
    callbacks[4] = callbackb;
    for (i=0;i<5;++i)
        callbacks[i](NULL);
};

//Method B
void callbacka(void* sender) 
{
    printf("Hello ");
}

void callbackb(void* sender)
{
    printf("world\n");
}

int main()
{
    void (*callbacks[5])(void* sender);
    unsigned i;
    for (i=0;i<5;++i)
        callbacks[i] = NULL;
    callbacks[2] = callbacka;
    callbacks[4] = callbackb;
    for (i=0;i<5;++i)
        if (callbacks[i])
            callbacks[i](NULL);
};

一些条件:

  • 我是否知道我的大部分回调有效与否重要吗?
  • 如果我使用 C 或 C++ 编译器编译我的代码,会有什么不同吗?
  • 目标平台(windows、linux、mac、iOS、android)是否改变了结果? (这个回调数组的全部原因是为了管理游戏中的回调)

最佳答案

您必须为此查看汇编代码。在我的平台(gcc,32 位)上,我发现编译器无法优化对 nullcallback 的调用。但是,如果我将您的方法 A 改进为以下内容

int main(void) {
  static void (*const callbacks[5])(void* sender) = {
    [0] = nullcallback,
    [1] = nullcallback,
    [2] = callbacka,
    [3] = nullcallback,
    [4] = callbackb,
  };
  for (unsigned i=0;i<5;++i)
        callbacks[i](0);
};

编译器能够展开循环并优化调用结果只是

    .type   main, @function
main:
    pushl   %ebp
    movl    %esp, %ebp
    andl    $-16, %esp
    subl    $16, %esp
    movl    $0, (%esp)
    call    callbacka
    movl    $0, (%esp)
    call    callbackb
    xorl    %eax, %eax
    leave
    ret
    .size   main, .-main

关于c++ - 类似 C 的回调处理 : which algorithm preforms faster?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7129703/

相关文章:

c# - 快速图中的无向图表示

c - 这个程序到底是什么意思? (Shellcoder的手册)

c - 变量的前置和后置增量操作在 TC 和 gcc 上给出不同的输出

c++ - 从类内部创建一个信号来调用外部函数?

Javascript - 回调函数

c++ - 在 Tiny Process Library 中阻塞直到进程结束

c++ - 为什么在按值返回时创建临时对象而不是在按值传递给函数参数时创建临时对象

c++ - C++/ObjC 中的链接器问题

c - 在 C 的数组中打印 2 个数字并跳过 2 个数字

python - 扭曲的回调循环阻止接收更多数据