【发布时间】:2017-06-07 15:41:36
【问题描述】:
假设我使用 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 没有(应该)修改它的参数。 (何时)GCC 会得出同样的结论吗?
换句话说,为了方便,我可以使用const 类型的huge_t 参数,还是应该使用指针?我可以想象这两个版本在某种意义上都是“好风格”,并且非常感谢知情意见。
【问题讨论】:
-
一般来说,我怀疑你是否可以保证编译器会进行这样的优化。但是,请以您认为“好、容易和简单”的方式编写代码。然后检查它是否满足您的性能要求。如果是这样,请为此感到高兴。如果没有,请进行分析以找出性能杀手在哪里。
-
如果编译器会得出这个结论并传递引用而不是如果 foo() 是一个长时间运行的函数并且有其他线程访问并可能修改您的 huge_t 实例会发生什么?
-
@mvidelgauz 那么应该声明为
volatile。开玩笑。我不相信允许编译器进行这种优化,但其他人可能比我更了解。 -
@PhilipCouling 我想说的是,基本的 C 哲学说编译器不会代替你做出任何决定。如果你想传递参考/ponter - 去做吧,你有它的语言结构。只有保证最终结果在所有情况下都保持不变,才能进行优化。除了线程之外,我们还可以考虑这种优化的其他不良副作用
-
@mvidelgauz 同意。比线程更好的例子是通过值和引用接受相同结构的函数。编译器无法保证按引用传递的副作用是什么,因此按值传递必须保持为按值传递。
标签: c gcc optimization constants