草庐IT

OPTIMIZATION

全部标签

c++ - 为什么链接器优化如此糟糕?

最近,一位同事向我指出,将所有内容编译到单个文件中创建的代码比编译单独的目标文件更有效-即使打开了链接时间优化。此外,该项目的总编译时间显着下降。鉴于使用C++的主要原因之一是代码效率,这让我感到惊讶。很明显,当归档器/链接器从目标文件中创建一个库,或者将它们链接到一个可执行文件中时,即使是简单的优化也会受到惩罚。在下面的示例中,当由链接器而不是编译器完成时,微不足道的内联会降低1.8%的性能。似乎编译器技术应该足够先进以处理这种相当常见的情况,但它并没有发生。这是一个使用VisualStudio2008的简单示例:#include#include#includeusingnamesp

c++ - 为什么链接器优化如此糟糕?

最近,一位同事向我指出,将所有内容编译到单个文件中创建的代码比编译单独的目标文件更有效-即使打开了链接时间优化。此外,该项目的总编译时间显着下降。鉴于使用C++的主要原因之一是代码效率,这让我感到惊讶。很明显,当归档器/链接器从目标文件中创建一个库,或者将它们链接到一个可执行文件中时,即使是简单的优化也会受到惩罚。在下面的示例中,当由链接器而不是编译器完成时,微不足道的内联会降低1.8%的性能。似乎编译器技术应该足够先进以处理这种相当常见的情况,但它并没有发生。这是一个使用VisualStudio2008的简单示例:#include#include#includeusingnamesp

c++ - 我应该在我的代码中使用 std::vector::at()

我今天注意到std::vector::at()比使用方括号[]访问值要慢得多。根据文档.at()更安全,因为它不会让我访问超出数组范围的值。但是,即使我使用at()访问超出范围的值,我显然仍然会遇到错误,所以无论如何我都需要避免这种情况。那么有什么好的理由为什么有人会使用at()而不是[]? 最佳答案 如果您有理由相信索引不在您的控制范围内,或者如果控制流程特别复杂并且您正在跟踪错误,那么您可能希望在期间使用at()调试阶段,但绝不在循环内部或任何您知道索引是安全的情况下。即使在其他情况下,您也应该预先验证索引(例如,如果它是用户输

c++ - 我应该在我的代码中使用 std::vector::at()

我今天注意到std::vector::at()比使用方括号[]访问值要慢得多。根据文档.at()更安全,因为它不会让我访问超出数组范围的值。但是,即使我使用at()访问超出范围的值,我显然仍然会遇到错误,所以无论如何我都需要避免这种情况。那么有什么好的理由为什么有人会使用at()而不是[]? 最佳答案 如果您有理由相信索引不在您的控制范围内,或者如果控制流程特别复杂并且您正在跟踪错误,那么您可能希望在期间使用at()调试阶段,但绝不在循环内部或任何您知道索引是安全的情况下。即使在其他情况下,您也应该预先验证索引(例如,如果它是用户输

c++ - 编译器会自动优化对数学函数的重复调用吗?

假设我有这段代码:#include//...floatf=rand();std::cout由于sin(f)是一个定义明确的函数,因此很容易优化:floatf=rand();floatsin_f=sin(f);std::cout这是一种期望现代C++编译器自行完成的优化吗?或者编译器没有办法确定sin(f)应该总是为f的相等值返回相同的值? 最佳答案 使用使用默认优化标志构建的g++:floatf=rand();40117e:e875010000call4012f8401183:8944241cmov%eax,0x1c(%esp)40

c++ - 编译器会自动优化对数学函数的重复调用吗?

假设我有这段代码:#include//...floatf=rand();std::cout由于sin(f)是一个定义明确的函数,因此很容易优化:floatf=rand();floatsin_f=sin(f);std::cout这是一种期望现代C++编译器自行完成的优化吗?或者编译器没有办法确定sin(f)应该总是为f的相等值返回相同的值? 最佳答案 使用使用默认优化标志构建的g++:floatf=rand();40117e:e875010000call4012f8401183:8944241cmov%eax,0x1c(%esp)40

c++ - 针对不同的目标架构进行编译和优化

总结:我想利用编译器优化和处理器指令集,但仍然有一个可移植的应用程序(在不同的处理器上运行)。通常我确实可以编译5次并让用户选择正确的运行。我的问题是:如何实现自动化,以便在运行时检测处理器并执行正确的可执行文件,而无需用户选择它?我有一个包含大量低级数学计算的应用程序。这些计算通常会运行很长时间。我想利用尽可能多的优化,最好也利用(并非总是支持)指令集。另一方面,我希望我的应用程序是可移植且易于使用的(所以我不想编译5个不同的版本并让用户选择)。是否有可能编译我的代码的5个不同版本并在执行时动态运行最优化的版本?有5个不同的版本,我的意思是不同的指令集和不同的处理器优化。我不关心应用

c++ - 针对不同的目标架构进行编译和优化

总结:我想利用编译器优化和处理器指令集,但仍然有一个可移植的应用程序(在不同的处理器上运行)。通常我确实可以编译5次并让用户选择正确的运行。我的问题是:如何实现自动化,以便在运行时检测处理器并执行正确的可执行文件,而无需用户选择它?我有一个包含大量低级数学计算的应用程序。这些计算通常会运行很长时间。我想利用尽可能多的优化,最好也利用(并非总是支持)指令集。另一方面,我希望我的应用程序是可移植且易于使用的(所以我不想编译5个不同的版本并让用户选择)。是否有可能编译我的代码的5个不同版本并在执行时动态运行最优化的版本?有5个不同的版本,我的意思是不同的指令集和不同的处理器优化。我不关心应用

c++ - 在 C++ 中,我可以声明一个引用以表明不会修改它吗?

如果我这样做typedefvoidCb();intfoo(intconst&a,Cbcb){intx=a;cb();returnx-a;}并用g++-O3-save-temps-cfoo.cpp编译,我看到减法被保留,而ifcb();被注释掉,整个函数优化为xorl%eax,%eax我可以对参数a的规范做些什么,这样无论对cb()的调用如何,减法都会得到优化,并且不会强制执行a是唯一的引用(即,它可以在其他地方引用,但不会通过这些引用对其进行修改)? 最佳答案 有__restrict扩展,你可以试试gcc.godbolt.org:t

c++ - 在 C++ 中,我可以声明一个引用以表明不会修改它吗?

如果我这样做typedefvoidCb();intfoo(intconst&a,Cbcb){intx=a;cb();returnx-a;}并用g++-O3-save-temps-cfoo.cpp编译,我看到减法被保留,而ifcb();被注释掉,整个函数优化为xorl%eax,%eax我可以对参数a的规范做些什么,这样无论对cb()的调用如何,减法都会得到优化,并且不会强制执行a是唯一的引用(即,它可以在其他地方引用,但不会通过这些引用对其进行修改)? 最佳答案 有__restrict扩展,你可以试试gcc.godbolt.org:t