gpt4 book ai didi

c++ - 为什么 gcc 不能内联可以确定的函数指针?

转载 作者:可可西里 更新时间:2023-11-01 17:32:46 32 4
gpt4 key购买 nike

以下程序在 centos 的 gcc 4.6.2 下用 -O3 编译:

#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>
using namespace std;

template <typename T>
class F {
public:
typedef void (T::*Func)();

F(Func f) : f_(f) {}

void operator()(T& t) {
(t.*f_)();
}
private:
Func f_;
};

struct X {
X() : x_(0) {}

void f(){
++x_;
}

int x_;
};

int main()
{
const int N = 100000000;
vector<X> xv(N);
auto begin = clock();
for_each (xv.begin(), xv.end(), F<X>(&X::f));
auto end = clock();
cout << end - begin << endl;
}

objdump -D 显示循环生成的代码是:

  40097c:       e8 57 fe ff ff          callq  4007d8 <clock@plt>
400981: 49 89 c5 mov %rax,%r13
400984: 0f 1f 40 00 nopl 0x0(%rax)
400988: 48 89 ef mov %rbp,%rdi
40098b: 48 83 c5 04 add $0x4,%rbp
40098f: e8 8c ff ff ff callq 400920 <_ZN1X1fEv>
400994: 4c 39 e5 cmp %r12,%rbp
400997: 75 ef jne 400988 <main+0x48>
400999: e8 3a fe ff ff callq 4007d8 <clock@plt>

显然 gcc 没有内联函数。为什么 gcc 不能进行这种优化?是否有任何编译器标志可以使 gcc 进行所需的优化?

最佳答案

我认为,GCC 试图优化整个 main 函数,但失败了(大量间接调用全局函数为 xv 分配/释放内存,获取计时器值,输入/输出等)。因此,您可以尝试将您的代码拆分为两个(或更多)独立的部分,如下所示:

inline
void foobar(vector<X>& xv)
{
for_each (xv.begin(), xv.end(), F<X>(&X::f));
}

int main()
{
const int N = 100000000;
vector<X> xv(N);
auto begin = clock();
foobar(xv);
auto end = clock();
cout << end - begin << endl;
}

所以,现在我们有了和以前“等价”的代码,但是 GCC 的优化器现在可以更轻松地完成任务了。我现在在汇编程序列表中没有看到任何对 ZN1X1fEv 的调用。

关于c++ - 为什么 gcc 不能内联可以确定的函数指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10047448/

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