Mil*_*avi 0 c++ inline-functions
我写了这段代码:
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;
}
Run Code Online (Sandbox Code Playgroud)
但是为什么这个程序的二进制文件与这个程序没有区别:
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;
}
Run Code Online (Sandbox Code Playgroud)
你在循环展开时混淆了函数内联:
循环展开意味着转换
for (int i = 0; i < 4; i++)
a(i);
Run Code Online (Sandbox Code Playgroud)
成
a(0); a(1); a(2); a(3);
Run Code Online (Sandbox Code Playgroud)
而内联函数意味着改变
void a(int i) { cout << i; }
for (int i = 0; i < 4; i++)
a(i);
Run Code Online (Sandbox Code Playgroud)
成
for (int i = 0; i < 4; i++)
cout << i;
Run Code Online (Sandbox Code Playgroud)
编译器确实有启用循环展开的选项(查看-funroll-loops和gcc的相关选项),但除非你非常努力地戳它们,否则它们中的大多数都非常不愿意展开999999999999迭代......(得到的二进制数将是多个TB).