为什么在c ++中使用内联函数不会增加二进制大小?

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)

us2*_*012 5

你在循环展开时混淆了函数内联:

循环展开意味着转换

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).