我们假设我使用GCC 5.4编译以下-O2
或-O3
优化级别。
typedef struct {
int data[90];
} huge_t;
int foo( const huge_t bar );
// ...
huge_t x = { 0 };
foo(x);
在这里,我冒昧地说没有必要在堆栈上创建x
的第二个副本,因为foo
不是(应该是)修改它的参数。 (何时)海湾合作委员会会得出同样的结论?
换句话说,为方便起见,我可以使用类型为const
的{{1}}个参数,还是应该使用指针?我可以想象两个版本都是"好的风格"在某种意义上,我非常欣赏一个知情的意见。
答案 0 :(得分:5)
如果你看这里:Why isn't pass struct by reference a common optimization?
任何C编译器都不太可能进行此优化。这通常不安全。
永远不要假设您的优化者会按照您想要的方式做事。优化器必须符合某些规则,以便它们永远不会破坏您的代码。有时候,当优化者不能理解某些东西是安全的时候。如果为了性能,您需要代码以某种方式运行,那么就这样写。