我写了这段代码:
inline int a_plus_b_power2(int a, int b) {
return (a + b) * (a + b);
}
int main() {
for(int a = 0; a < 9999999999999; ++a)
for(int b = 0; b < 999999999999; ++b)
a_plus_b_power2(a, b);
return 0;
}
但为什么这个程序的二进制文件与此程序没有区别:
inline int a_plus_b_power2(int a, int b) {
return (a + b) * (a + b);
}
int main() {
for(int a = 0; a < 9; ++a)
for(int b = 0; b < 9; ++b)
a_plus_b_power2(a, b);
return 0;
}
答案 0 :(得分:5)
您正在使用循环展开来混淆函数内联:
循环展开意味着转化
for (int i = 0; i < 4; i++)
a(i);
到
a(0); a(1); a(2); a(3);
虽然函数内联意味着转换
void a(int i) { cout << i; }
for (int i = 0; i < 4; i++)
a(i);
到
for (int i = 0; i < 4; i++)
cout << i;
编译器确实有启用循环展开的选项(查看-funroll-loops
和gcc的相关选项),但除非你非常努力地戳它们,否则它们中的大多数都非常不愿意展开999999999999迭代......(结果二进制将是多TB的。)
答案 1 :(得分:1)
每次调用只会“粘贴”一次内联函数。
在两个示例中,内联函数仅调用一次,尽管它被多次调用。
我相信你想要这样的东西:
for (unsigned int a = 0; a < 9; ++a)
{
for (unsigned int b = 0; b < 9; b+= 3) // Incremented by 3 because of 3 calls in loop.
{
a_plus_b_power_2(a, b + 0);
a_plus_b_power_2(a, b + 1);
a_plus_b_power_2(a, b + 2);
}
}
上面的示例可能会导致编译器在循环中将代码粘贴到内联函数中3次,并增加二进制文件的大小。
注意:关闭优化,因为优化可能会导致编译器将内联函数转换为循环内的独立函数。