gpt4 book ai didi

c++ - 为什么明明一个模板函数实例化不会被内联?

转载 作者:可可西里 更新时间:2023-11-01 18:20:39 30 4
gpt4 key购买 nike

关于 Function passed as template argument ,Ben Supnik 提供的社区 wiki 答案讨论了内联实例化函数模板的问题。

在该答案中有以下代码:

template<typename OP>
int do_op(int a, int b, OP op)
{
return op(a,b,);
}

int add(int a, b) { return a + b; }

int (* func_ptr)(int, int) = add;

int c = do_op(4,5,func_ptr);

答案继续说这个(关于最后一行,它实例化函数模板 do_op):

clearly this is not getting inlined.

我的问题是:为什么很明显这没有被内联?

最佳答案

他说的(我认为)是 add函数没有被内联。换句话说,编译器可能内联 do_op像这样:

int c = func_ptr(4, 5);

但它不会内联 add像这样:

int c = 4 + 5;

但是,他在这个简单的例子中可能是错误的。

通常,当您通过指针调用函数时,编译器无法(在编译时)知道您将调用什么函数,因此它无法内联该函数。示例:

void f1() { ... }
void f2() { ... }

void callThroughPointer() {
int i = arc4random_uniform(2);
void (*f)() = i ? f2 : f1;
f();
}

在这里,编译器无法知道callThroughPointer是否存在。会调用f1f2 ,因此它无法内联 f1f2callThroughPointer .

但是,如果编译器可以在编译时证明将调用什么函数,则允许内联该函数。示例:

void f1() { ... }
void f2() { ... }

void callThroughPointer2() {
int i = arc4random_uniform(2);
void (*f)() = i ? f2 : f1;
f = f1;
f();
}

在这里,编译器可以证明f永远是f1 ,因此允许内联 f1进入callThroughPointer2 . (这并不意味着它内联 f1 …)

同样,在您的帖子中引用的示例中,编译器可以证明 func_ptr总是 add在调用 do_op ,因此允许内联 add . (这并不意味着它内联 add …)

关于c++ - 为什么明明一个模板函数实例化不会被内联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13674935/

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