直到今天,我一直认为体面编译器会自动将结构传递值转换为传递引用,如果结构足够大,后者会更快。据我所知,这似乎是一个不费吹灰之力的优化。然而,为了满足我对这是否真的发生的好奇心,我在C++和D中创建了一个简单的测试用例,并查看了GCC和Digital Mars D的输出。两者都坚持按值传递32字节的结构,有问题的函数是加起来的成员和返回的值,没有修改传入的结构。C++版本如下。为什么不通过引用传递结构通用优化?
#include "iostream.h"
struct S {
int i, j, k, l, m, n, o, p;
};
int foo(S s) {
return s.i + s.j + s.k + s.l + s.m + s.n + s.o + s.p;
}
int main() {
S s;
int bar = foo(s);
cout << bar;
}
我的问题是,为什么赫克不会像这样由编译器优化,以传递通过引用,而不是实际推动所有这些int
小号到堆栈?注:使用的编译器开关:GCC -O2(-O3内联foo()。),DMD -O -inline -release。
编辑:显然,在通常情况下,传值与传递引用的语义不会相同,例如,如果涉及到复制构造函数或原始结构在被调用方中被修改。然而,在很多现实场景中,语义在可观察行为方面将是相同的。这些是我所问的情况。
当进行链接时间优化,也就是链接时间代码生成或整个程序编译时,编译器不需要仅基于声明来编译该调用。它充分了解发生了什么。为了编译对大小和速度敏感的嵌入式应用程序,链接时间代码生成是唯一的方法。 – 2015-02-03 16:16:22