0

将以下代码放在内联函数中是否合理,或者内联太大:

getPriority(const Data& data)
{
    Priority plidPriority = PRIORITY_STANDARD;

    if (data.isIPaddr)
    {
        Priority = PRIORITY_HIGHEST;
    }
    else if (data.plid == PROTO_HTTP || data.plid == PROTO_SIP || data.plid == PROTO_RTCP)
    {
        Priority = PRIORITY_PLID;
    }
    else if (data.port && data.port < 1024)
    {
        Priority = PRIORITY_ELEVATED;
    }

    return Priority;
}
4

4 回答 4

1
  1. 自动内联的功能应该多短?是否有任何线路限制?

没有硬限制(或者更准确地说,我们可以在给定系统上找到上限,但您不会在任何地方找到指定的上限)。编译器试图预测在特定情况下此过程的优势可能是什么。如果编译器决定内联函数会使代码变慢或变大到无法接受的程度,它就不会内联它。或者,如果它只是因为语法依赖而不能,例如其他代码使用函数指针进行回调,或者在动态/静态代码库中将函数导出到外部。还要记住,标记函数inline只是表达一个愿望,编译器没有义务这样做。在 C 中,任何具有内部链接的函数都可以内联,但具有外部链接的函数会受到限制。

2. Is there any way to know that a function is automatically in-lined ?

您可以反汇编二进制文件,您将看到是否有对函数的调用或是否在行中

内联函数会提高性能吗?

内联函数

于 2013-09-30T16:18:45.433 回答
1

仅仅因为您想将函数体内联替换到函数调用点而将任何代码用于内联是不合理的,任何现代编译器都会自己这样做。
您应该使用inline安全绕过一个定义规则 (ODR) 并在头文件中定义函数的方法,而不是出于性能原因这样做。

于 2013-09-30T15:56:44.003 回答
0

内联的主要问题是代码膨胀。因此,如果您的函数仅在一个/几个地方被调用(并且函数被多次调用,因此开销非常大),也可以内联更大的代码(假设编译器内联它)并且可以内联它。如果您在代码中的许多地方调用一个函数,那么这可能是一个问题。

所以这取决于如何从此处未显示的代码中调用此函数。

它是否内联也取决于编译器。如果您认为内联非常必要(您只能在基准测试后评估)并且代码很大,您可以通过提供相关的编译器选项来增加限制。

于 2013-09-30T16:02:01.427 回答
0

内联实际上只是对编译器的一个建议。对于您的情况,它可能已经内联,或者完全忽略 inline 关键字

于 2013-09-30T16:18:21.817 回答