【问题标题】:Passing a large const struct to a function将大型 const 结构传递给函数
【发布时间】: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


【解决方案1】:

如果你看这里:Why isn't pass struct by reference a common optimization?

任何 C 编译器都不太可能进行这种优化。通常这样做并不安全。

永远不要假设您的优化器会按照您想要的方式做事。优化器必须遵守某些规则,以便他们永远不会破坏您的代码。有时,当优化器无法做到时,您知道某些东西是安全的。如果出于性能考虑,您需要您的代码以某种方式运行,那么请以这种方式编写。

【讨论】:

  • 一般来说:如果您使用的特定编译器执行您正在寻找的优化,请不要假设所有编译器都可以。 @Philip 说 correclty:“如果你需要你的代码以某种方式运行,那就这样写吧。”
  • 谢谢,很好的参考,由于某种原因我没有看到那个帖子。另外,请大家保持冷静,我命名 gcc 只是为了举一个具体的例子,而我老实说只是好奇。我会郑重地向not help the compiler 发誓;-)。
猜你喜欢
  • 2012-05-09
  • 1970-01-01
  • 2013-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多