草庐IT

OPTIMIZATION

全部标签

c++ - 如何检查 C++ 复制省略

我在copyellision上看到这篇文章在C++中,我在boost库中看到了关于它的评论。这很吸引人,因为我更喜欢我的函数看起来像verylargereturntypeDoSomething(...)而不是voidDoSomething(...,verylargereturntype&retval)所以,我有两个问题Google几乎没有这方面的文档,这有多真实?如何检查此优化是否实际发生?我假设它涉及查看程序集,但可以说这不是我的强项。如果有人能给出一个非常基本的例子来说明成功的省略是什么样子,那将非常有用我不会仅仅为了美化事物而使用复制省略,但如果我能保证它有效,那么它听起来非常有

c++ - 内联汇编会影响可移植性吗?

假设您编写了可在不同平台上流畅运行的可移植C++代码。要进行一些修改以优化性能,您可以在代码中使用内联汇编。这是一个好的做法(搁置编译器优化)还是会给可移植性带来麻烦? 最佳答案 显然它破坏了可移植性——代码只能在汇编语言所针对的特定体系结构上工作。此外,这通常是浪费时间-编译器的优化器几乎肯定比您更擅长编写汇编代码。 关于c++-内联汇编会影响可移植性吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c

大型数组的 C# 内存优化

下面是用c++和c#编写的两个代码部分,它们做的事情完全相同:C++http://ideone.com/UfL5R#includeintmain(intargc,char*argv[]){charp[1000000];unsignedinti,j;unsignedlonglongs=0;for(i=2;i时间:0.01s内存:2576kBC#http://ideone.com/baXYmusingSystem;namespaceConsoleApplication4{internalclassProgram{privatestaticvoidMain(string[]args){var

c++ - C++中比较的效率? (绝对值(X)> 1 对比绝对值(x)!= 0)

我知道-过早的优化。但是我有代码可以查明某个位置是否发生了变化,而不是缓存的位置。当前代码是:if(abs(newpos-oldpos)>1){.....}使用下面的是不是更有效率?if(abs(newpos-oldpos)!=0){....}为什么或为什么不?我目前正在思考哪个更具可读性,并且想知道我是否遗漏了性能差异。 最佳答案 为什么不是这个?if(newpos!=oldpos){...}由于缺少abs(),因此比两者都更高效,并且启动起来更清晰。 关于c++-C++中比较的效率?

c++ - 为什么将 return 移动到函数末尾效率较低?

很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visitthehelpcenter.关闭10年前。编辑:删除UB后(好地方,我错过了),时间或多或少相同。将标记版主将其删除。这两个函数是相同的,除了foo在两个分支上的if中都有返回,而goo有一个单个return最后:intfoo(){staticintx=0;if(x){x>2?x=0:++x;returnx-1;}else{x++;returnx-1;}}intgoo(){staticintx=0;if(x){x>2?x=0:++x;}

optimization - 有没有办法告诉 GCC 不要优化一段特定的代码?

我正在从事一个依赖编译器优化的项目,但我需要一些不被GCC优化的代码。这可能吗? 最佳答案 GCC4.4有一个属性:intfoo(inti)__attribute__((optimize("-O3")));记录在:https://gcc.gnu.org/onlinedocs/gcc-5.1.0/gcc/Function-Attributes.html#index-g_t_0040code_007boptimize_007d-function-attribute-3195 关于optimi

c++ - 为什么在乘法之前转置矩阵会导致很大的加速

我听说乘法之前的转置矩阵会大大加快运算速度,因为缓存局部性。所以我写了一个简单的C++程序来测试行优先排序(编译需要C++11和boost)。结果令人震惊:7.43秒对0.94秒。但是我不明白为什么它会加速。事实上,在第二个版本(第一个转置)中,乘法代码通过stride-1模式访问数据,并且比第一个版本具有更好的局部性。但是,要转置矩阵B,也必须非顺序地访问数据,并且也会导致大量缓存未命中。分配内存和复制数据的开销也应该是不可忽略的。那么,为什么第二个版本会大大加快代码速度?#include#include#include#includestd::vectorrandom_ints(s

c++ - 什么是复制省略和返回值优化?

什么是复制省略?什么是(命名)返回值优化?它们意味着什么?它们会在什么情况下发生?什么是限制?如果有人提到这个问题,您可能正在寻找theintroduction.有关技术概述,请参阅thestandardreference.参见commoncaseshere. 最佳答案 介绍技术概述-skiptothisanswer.对于发生复制省略的常见情况-skiptothisanswer.复制省略是大多数编译器实现的优化,以防止在某些情况下进行额外(可能代价高昂)的复制。它使按值返回或按值传递在实践中可行(有限制)。这是唯一一种省略(哈哈!)

c++ - 什么时候将全局变量的地址作为模板参数传递有用?

我最近看了一段来自Microsoft的视频,解释了C++17的一些新特性,我很想找到C++14(甚至可能更早?)的一个特性,它允许你使用地址全局变量作为模板参数的常量表达式。这允许如下代码:#includeintg_iTest=5;templatestructS{staticintTestAdd(intiTest){*Addr=iTest+*Addr;return*Addr;}};intmain(){Ss;std::cout这将导致输出10。就目前而言,这对我来说是该语言的一个有趣的特性,但是,视频中的人强调这是一个有用的功能,并且已用于在传递全局变量时减少代码膨胀。但是,我不明白它是

c++ - 与神秘指针相关的多线程速度减慢

背景:所以我正在研究光线追踪器......为了构建空间分区方案,我最初有一些这样的代码:if(msize基本上,这个空间划分树构造完成后,光线遍历树寻找模型,这些模型都存储在一个大数组中。叶节点包含模型的指针数组。然后我意识到,嘿,我没有理由添加额外的间接级别;如果我正确地安排我的模型,我可以让叶节点直接指向大量模型。大数组中彼此相邻的模型都属于给定的叶节点,因此叶节点将包含指向模型的指针。所以我这样做了,并在其他一切保持不变的情况下对其进行了测试。现在人们会认为这显然会加快程序的速度。好吧,它确实加快了单线程版本的速度(大约10%),但它减慢了多线程版本的速度(大约15%!如果你正在