并非所有语句的性能开销都相同
在 Kernighan 和 Ritchie 的《C 程序设计语言》一书中,所有语句的性能开销都一样。一个
函数调用可能包含任意复杂的计算。但一个赋值语句通常只是将保存在一个寄存器中的内
容变为另外一个内容保存在另一个寄存器中。因此,以下赋值语句
int i,j;
...
i = j;
会 从 j 中 复 制 2 或 4 字节到 i 中。所声明的变量类型可能是 int、float 或 struct big
struct *,但是赋值语句所做的工作量是一样的。
不过现在,这已经不再是正确的了。在 C++ 中,将一个 int 赋值给另外一个 int 的工作量
与相应的 C 语言赋值语句的工作量是完全一样的。但是,一个赋值语句,如 BigInstance
i = OtherObject; 会 复 制 整 个 对 象 的 结 构。 更 值 得 注 意 的 是, 这 类 赋 值 语 句 会 调 用
BigInstance 的构造函数,而其中可能隐藏了不确定的复杂性。当一个表达式被传递给一
个函数的形参时,也会调用构造函数。当函数返回值时也是一样的。而且,由于算数操作
符和比较操作符也可以被重载,所以 A=B*C; 可能是 n 维矩阵相乘,if (x<y)... 可能比较
的是具有任意复杂度的有向图中的两条路径。对优化而言,这一点的意义是某些语句隐藏
了大量的计算,但从这些语句的外表上看不出它的性能开销会有多大。
先学习 C++ 的开发人员不会对此感到惊讶。但是对那些先学习 C 的开发人员来说,他们
的直觉可能会将他们引向灾难性的歧途
与相应的 C 语言赋值语句的工作量是完全一样的。但是,一个赋值语句,如 BigInstance
i = OtherObject; 会 复 制 整 个 对 象 的 结 构。 更 值 得 注 意 的 是, 这 类 赋 值 语 句 会 调 用
BigInstance 的构造函数,而其中可能隐藏了不确定的复杂性。当一个表达式被传递给一
个函数的形参时,也会调用构造函数。当函数返回值时也是一样的。而且,由于算数操作
符和比较操作符也可以被重载,所以 A=B*C; 可能是 n 维矩阵相乘,if (x<y)... 可能比较
的是具有任意复杂度的有向图中的两条路径。对优化而言,这一点的意义是某些语句隐藏
了大量的计算,但从这些语句的外表上看不出它的性能开销会有多大。
先学习 C++ 的开发人员不会对此感到惊讶。但是对那些先学习 C 的开发人员来说,他们
的直觉可能会将他们引向灾难性的歧途