代码之家  ›  专栏  ›  技术社区  ›  Christian Ammer

编译器帮助其完成优化任务的提示

  •  2
  • Christian Ammer  · 技术社区  · 15 年前

    这个 const and volatile 关于“在发行版中幸存下来”一章的文章让我想到编译器可以使用 常量 关键字作为其优化作业的提示。

    您知道编译器的其他优化提示或函数的设计原则,以便编译器可以使它们内联吗?

    顺便问一下,是否将原语类型函数参数声明为const或const引用(如 void foo(const int i) void foo(const int& i) )?

    谢谢!

    7 回复  |  直到 15 年前
        1
  •  3
  •   James McNellis    15 年前

    很少有 const 限定可以帮助编译器优化代码。你可以在赫伯·萨特的书里读到更多关于为什么会这样的故事 "Constant Optimization?"

    关于您的最后一个问题:一般来说,您应该更愿意忽略那些易于复制的有价值的东西(比如基本类型的对象-- int s和 float 以及小类类型对象),并通过常量引用传递其他类型。这是一个非常普遍的规则,有很多警告和例外。

        2
  •  1
  •   ronag    15 年前

    我不认为编译器可以使用const关键字进行优化,因为在任何时候,constness都可以被丢弃。

    与其说是优化,不如说是正确。

        3
  •  1
  •   Roland Illig    15 年前

    一旦启用某些优化,编译器将注意到 i 不会被修改,所以你是否声明 int 或作为 const int 与生成的代码无关。

    传递参数的点 const & 是为了避免不必要的复制。如果参数很小(一个机器字或更少),这不会带来更好的性能,所以您不应该这样做。 foo(int) foo(const int&) .

        4
  •  1
  •   Puppy    15 年前

    这两种形式都没有实际的好处。如果类型小于一个机器字,则按值计算。另一件事是,现代编译器的语义分析远远高于const所能做和不能做的,您只能在它是预编译的或者您的代码非常复杂的情况下应用优化。你链接到的文章已经有好几年的历史了,从那以后,编译器除了做大量的改进之外什么也没有做。

        5
  •  0
  •   Matthew Iselin    15 年前

    一些“通用编译器”的事情让我头昏脑胀。

    • const作为变量永远不会改变的提示
    • volatile表示变量可以在任何时候更改
    • 限制关键字
    • 内存障碍(提示编译器一个特定的顺序)-可能不是一个“优化”你介意。
    • 内联关键字(非常小心地使用)

    不过,所有这些都应该只来自于一个广泛的分析例程,以便您知道实际需要优化的是什么。编译器通常都很擅长优化,而不需要程序员提供太多提示。

        6
  •  0
  •   vpit3833    15 年前

    如果您查看Linux内核或类似项目的源代码,您将发现传递给gcc(或使用的任何编译器)的所有优化线索。Linux内核使用gcc提供的所有特性,即使它不在标准中。

    This page 总结了gcc对C语言的扩展。我在这里提到C是因为const和volatile也在C中使用。超过C或C++,编译器优化成为这里的焦点问题。

        7
  •  0
  •   Mike Dunlavey    15 年前

    我不认为 const 与优化有很大关系,尽管它有帮助。 编译时检查的真正价值不在于防止您修改不应该修改的内容,即防止出现错误吗?

    对于不打算修改的小参数,请使用按值调用。

    对于不打算修改的大参数,请使用“按引用调用”或“传递地址”(基本上是相同的),以及 常量 .

    对于你 要修改,删除 常量 .

    顺便说一句:如果这是新闻,为了获得真正的性能,您需要知道如何通过分析来发现实际存在的问题。没有一个编译器可以帮你。