gpt4 book ai didi

c - 循环中的函数指针

转载 作者:行者123 更新时间:2023-12-03 17:10:53 24 4
gpt4 key购买 nike

在我的学士论文中,我编写了一个程序(用 C 语言)对大型表进行排序,现在一切正常。然而,对于我的一些测试文件,该程序有点慢。为了能够更有效地存储临时数据,用户可以为表的每一列指定数据类型。然后,输入数据首先被解析为某种二进制格式,然后排序,最后转换回文本形式。

对于每种数据类型,必须实现四个函数(编码、解码、getlength 和比较),并且指向这些函数的指针存储在每一列的数组中。因此,要对表的一行执行任何操作,我必须为循环中的每一行调用正确的函数,如果列相当短,这会产生相当大的开销。

作为示例,以下是我的行比较函数的代码(从 qsort 调用):

int line_cmp(const void *p1,const void *p2)
{
int i,o1=0,o2=0,r;

for(i=0;i<opt.nocols;i++)
if((r=(*opt.cols[i].cmp)(*(char* const*)p1,&o1,
*(char* const*)p2,&o2)))
return r;

return 0;
}

此函数循环遍历所有列,如果被调用函数返回非 0 的值(表示不等于),则返回该值(就像 qsort 要求的那样)。

现在我的问题是,如何优化这个(或类似的)函数(如果可能的话),特别是当所有指针仅设置一次并且在整个程序期间从未更改时?

编辑:我使用函数指针,以便第三方可以开发任意数据类型。然后将通过(dlopen 等)加载它们。因此,我想不出一种通用的二进制格式来比较列,并且二进制数据对于我的程序来说只是一个黑匣子。

最佳答案

您应该检查代码生成的汇编程序,但这里可能会遇到间接寻址过多的问题,而且编译器必须重新加载 opt 的内容。

还取决于您的全局 opt 的定义方式(是否为 const)编译器能够优化的程度。由于您在 opt 的迭代使用之间进行了函数调用,因此编译器不会知道该值是否已更改。

尝试做类似的事情

size_t nocols = opt.nocols
columnType const*const myFunc = opt.cols;

并使用 nocolsmyFunc[i].comp 进行循环。

关于c - 循环中的函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5513086/

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