gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 05:45:18 28 4
gpt4 key购买 nike

我有一组像这样的回调 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com