根据该网站(link、link、link)上各种问题的答案,不允许将函数指针转换为数据指针。
这对我来说很有意义,因为有些CPU体系结构中的函数指针比数据指针长:通过将函数指针转换为数据指针,数据就会丢失。
具有“中等”内存布局(sizeof(void (*)())=4,sizeof(void *)=2)的桌面程序的一个历史性示例是x86-16;您仍然可以在一些现代的(主要是非桌面的)CPU中找到这种行为。
如果变量将持有指向“未知”数据的指针,则使用数据类型void *。
我目前正在编写一个程序,其中变量可能包含指向“未知”函数的指针(就像dlsym()在Linux中返回的值或GetProcAddress()在GetProcAddress()中返回的值一样):
// ---- file1.c ----
typedef /* What to use here? */ functionPointer;
...
functionPointer myPointer, myPointer2;
myPointer = getFunction(1);
myPointer2 = getFunction(2);
...
double (*fptr)(double, void *) = myPointer2;
...
// ---- file2.c ----
void func1(void);
double func2(double x, void * y);
functionPointer getFunction(int which)
{
switch(which)
{
case 1: return &func1;
case 2: return &func2;
...
}
}如果程序应该是独立于平台的,那么在这种情况下将使用哪种数据类型?
如果没有适用于所有平台(桌面、微控制器、DSP、GPU等)的解决方案:
有没有一种适用于所有桌面的解决方案?
发布于 2022-01-22 13:01:06
对于泛型函数指针,请使用任意函数指针类型。
C 2018年6.3.2.3 8说:
指向一种类型的函数的指针可以转换为指向另一种类型的函数的指针,然后再转换回来;结果应该与原始指针…相比较。
这意味着您可以将任何函数指针转换为不同类型的函数指针。只要在调用函数时将其转换回原始类型,行为就会被定义,并且它将正确地调用原始函数。
C不提供指定的泛型函数指针类型,比如对象的void *。您只需为您的程序选择一个,比如void (*)(),并使用它。
发布于 2022-01-22 12:03:01
您在平台列表中包括了"GPU“。有些GPU甚至不支持真正的函数调用,只支持内联和展开(即在OpenCL中)。"goto“命令也是如此。它甚至不允许从函数的另一个入口点进入。
如果可以,对函数标识符数组进行排序(这会提示要调用哪个函数)。然后将不同的块分割成不同的数组,然后在它们自己的内核中调用它们。如果有100个不同的函数,那么在对数组进行排序之后,可以在它们自己的内核中调用它们。这甚至优化了GPU着色器的分支性能问题。在内核完成之后,您可以继续主算法。
https://stackoverflow.com/questions/70811988
复制相似问题