草庐IT

OPTIMIZATION

全部标签

c++ - 编译器会优化 malloc/free 或 new/delete 对到 alloca

有没有成熟的C/C++编译器,能够优化malloc/free(或者new/delete)对信息alloca?换句话说,从基于堆的内存转换为基于堆栈的内存(仅适用于某些有限的情况)。只有当两个函数在同一个函数中(甚至在同一block{}中)时,才允许对malloc/free进行这种优化,并且每次malloc时都会调用free叫做。另外,让我们考虑一下指向malloced内存的指针没有保存在某个全局变量中。那么,GCC/LLVM+clang/Intel编译器是否会转换这样的代码块:{char*carray;carray=malloc(100);//ormalloc(N)//somestri

c++ - 编译器会优化 malloc/free 或 new/delete 对到 alloca

有没有成熟的C/C++编译器,能够优化malloc/free(或者new/delete)对信息alloca?换句话说,从基于堆的内存转换为基于堆栈的内存(仅适用于某些有限的情况)。只有当两个函数在同一个函数中(甚至在同一block{}中)时,才允许对malloc/free进行这种优化,并且每次malloc时都会调用free叫做。另外,让我们考虑一下指向malloced内存的指针没有保存在某个全局变量中。那么,GCC/LLVM+clang/Intel编译器是否会转换这样的代码块:{char*carray;carray=malloc(100);//ormalloc(N)//somestri

c++ - 如何用 g++ 向量化我的循环?

我在搜索时找到的介绍链接:6.59.14Loop-SpecificPragmas2.100PragmaLoop_OptimizeHowtogivehinttogccaboutloopcountTellgcctospecificallyunrollaloopHowtoForceVectorizationinC++正如您所见,它们中的大多数都是用于C的,但我认为它们也可能适用于C++。这是我的代码:template//__attribute__((optimize("unroll-loops")))//__attribute__((pure))voidfoo(std::vector&p1,

c++ - 如何用 g++ 向量化我的循环?

我在搜索时找到的介绍链接:6.59.14Loop-SpecificPragmas2.100PragmaLoop_OptimizeHowtogivehinttogccaboutloopcountTellgcctospecificallyunrollaloopHowtoForceVectorizationinC++正如您所见,它们中的大多数都是用于C的,但我认为它们也可能适用于C++。这是我的代码:template//__attribute__((optimize("unroll-loops")))//__attribute__((pure))voidfoo(std::vector&p1,

c++ - 难以衡量 C/C++ 性能

我编写了一段C代码来说明关于优化和分支预测的讨论中的一个观点。然后我注意到比我预期的更多样化的结果。我的目标是用一种介于C++和C之间的通用子集的语言编写它,这两种语言都符合标准并且相当可移植。它在不同的WindowsPC上进行了测试:#include#include///@return-timedifferencebetweenstartandstopinmillisecondsintms_elapsed(clock_tstart,clock_tstop){return(int)(1000.0*(stop-start)/CLOCKS_PER_SEC);}intconstBillion

c++ - 难以衡量 C/C++ 性能

我编写了一段C代码来说明关于优化和分支预测的讨论中的一个观点。然后我注意到比我预期的更多样化的结果。我的目标是用一种介于C++和C之间的通用子集的语言编写它,这两种语言都符合标准并且相当可移植。它在不同的WindowsPC上进行了测试:#include#include///@return-timedifferencebetweenstartandstopinmillisecondsintms_elapsed(clock_tstart,clock_tstop){return(int)(1000.0*(stop-start)/CLOCKS_PER_SEC);}intconstBillion

c++ - 在容器上(循环期间)重复调用 size() 是否不好?

出于效率原因,我总是避免编写这样的循环:for(std::size_ti=0;i其中vec是一个STL容器。相反,我要么做conststd::size_tvec_size=vec.size();for(std::size_ti=0;i或使用容器迭代器。但第一个解决方案真的有多糟糕?我记得在Meyers中读到它将是二次的而不是线性的,因为vector不知道它的大小并且必须反复计数。但是现代编译器不会检测到这一点并对其进行优化吗? 最佳答案 vector::size()是恒定时间的,通常实现为经过优化的简单内联函数。不要费心手动优化它。

c++ - 在容器上(循环期间)重复调用 size() 是否不好?

出于效率原因,我总是避免编写这样的循环:for(std::size_ti=0;i其中vec是一个STL容器。相反,我要么做conststd::size_tvec_size=vec.size();for(std::size_ti=0;i或使用容器迭代器。但第一个解决方案真的有多糟糕?我记得在Meyers中读到它将是二次的而不是线性的,因为vector不知道它的大小并且必须反复计数。但是现代编译器不会检测到这一点并对其进行优化吗? 最佳答案 vector::size()是恒定时间的,通常实现为经过优化的简单内联函数。不要费心手动优化它。

c++ - 使用位移重新实现模?

我正在为一个非常有限的系统编写一些代码,其中mod运算符非常慢。在我的代码中,模数需要每秒使用大约180次,我认为尽可能多地删除它会显着提高我的代码速度,截至目前,我的mainloop的一个周期不会以1/60的速度运行第二,它应该。我想知道是否可以仅使用位移来重新实现模数,就像乘法和除法一样。所以这是我迄今为止在C++中的代码(如果我可以使用汇编执行模数,那就更好了)。如何在不使用除法或乘法的情况下删除模数?while(input>0){out=(out>8)+(input>>1);}编辑:实际上我意识到我需要每秒执行超过180次。看到输入的值可以是一个非常大的数字,最多40位。

c++ - 使用位移重新实现模?

我正在为一个非常有限的系统编写一些代码,其中mod运算符非常慢。在我的代码中,模数需要每秒使用大约180次,我认为尽可能多地删除它会显着提高我的代码速度,截至目前,我的mainloop的一个周期不会以1/60的速度运行第二,它应该。我想知道是否可以仅使用位移来重新实现模数,就像乘法和除法一样。所以这是我迄今为止在C++中的代码(如果我可以使用汇编执行模数,那就更好了)。如何在不使用除法或乘法的情况下删除模数?while(input>0){out=(out>8)+(input>>1);}编辑:实际上我意识到我需要每秒执行超过180次。看到输入的值可以是一个非常大的数字,最多40位。