C++ Clang/LLVM中函数指针的内联数组

C++ Clang/LLVM中函数指针的内联数组,c++,llvm,clang,C++,Llvm,Clang,我有一个专用的MCU,它执行定期任务,并希望用其他事情来填补它的“停机时间”。通常,这是通过大型switch语句完成的,这是可以的,但我想知道是否有更优雅的方法。这是这个特定设备的代码中非常常见的模式,因此有一个通用方法会很好 因此,我编写了以下代码,它可以工作,但目前没有内联函数 static InterlacedFunction searchFunctions[4] = {...}; typedef int (* const InterlacedFunction)(int)

我有一个专用的MCU,它执行定期任务,并希望用其他事情来填补它的“停机时间”。通常,这是通过大型switch语句完成的,这是可以的,但我想知道是否有更优雅的方法。这是这个特定设备的代码中非常常见的模式,因此有一个通用方法会很好

因此,我编写了以下代码,它可以工作,但目前没有内联函数

    static InterlacedFunction searchFunctions[4] = {...};

    typedef int (* const InterlacedFunction)(int);

    template<const int numberOfWovenFunctions> int SendPacketWithWovenFunctions(
            int * packet,
            const int packetLength,
            InterlacedFunction (&functions)[numberOfWovenFunctions],
            int firstArgument = 0)
    {
            int returnFromLastWoven = (numberOfWovenFunctions != 0) ? (functions[0])(firstArgument) : 0;

            SendData(packet[0]);

            for(int i = 1; i < packetLength; i++)
            {
                    if(i < numberOfWovenFunctions)
                            returnFromLastWoven = (functions[i])(returnFromLastWoven);
                    SendData(packet[i]);
            }
            return returnFromLastWoven;
    }
静态交错函数searchFunctions[4]={…};
typedef int(*常量交错函数)(int);
模板int sendpacketwithwoven函数(
int*数据包,
const int packetLength,
交错函数(&functions)[numberofwoven函数],
int firstArgument=0)
{
int returnFromLastWoven=(NumberOfWoven函数!=0)?(函数[0])(第一个参数):0;
发送数据(数据包[0]);
对于(int i=1;i

我是否遗漏了什么,是Clang不可能内联这些函数,还是Clang还没有进行优化?

一般来说,编译器并不热衷于通过函数指针内联调用,即使在编译时已知函数指针

在这种情况下,您依赖的是编译器足够聪明,能够将循环展开到一个NumberOfWoven函数迭代块中,或者为您生成一个内联函数开关,这两者都是不可能的

如果你想让这个习惯用法更通用,你可以使用递归模板(如果你没有c++11可变模板,那么写起来会很痛苦),尽管它是否真的构成了一种简化可能是有疑问的

i、 e.在编织函数指针值列表上创建模板,并在每个级别调用编织函数,存储结果,调用sendPacket,然后使用存储的结果递归到下一个模板级别。类似于(未经测试):

模板
结构织物功能;
//基本情况-发送剩余数据包
模板
结构织物功能{
静态int调用(int值、int*数据包、大小\u t计数){
对于(size_t c=0;c
然后在发送中:

typedef WovenFunc<Woven1, Woven2, Woven3> WovenSend
WovenSend::call(returnFromLastWoven, packets, packetLength);
typedef WovenFunc WovenSend
WovenSend::call(从LastWoven返回,数据包,数据包长度);

显然,您可以使其更通用。

您可能正在寻找延续/光纤/用户模式线程。有很多库可以实现它们。谢谢你的回答!根据Clang状态页面,目前支持可变模板,因此我将检查它们。我刚刚完成了这项工作,并认为您应该知道Clang似乎不喜欢空模板参数。经过一些挖掘,在基本用例中添加“typename=void”使它工作了!谢谢你的帮助。
typedef WovenFunc<Woven1, Woven2, Woven3> WovenSend
WovenSend::call(returnFromLastWoven, packets, packetLength);