Tag: 编译器优化

超越-O3 / -Ofast的G ++优化

问题 我们有一个用于模拟任务的中型程序,我们需要优化。 我们已经尽我们最大的优化来源,以尽可能限制我们的编程技能,包括与Gprof和Valgrind分析。 当最后完成时,我们想在几个系统上运行该程序可能几个月。 因此,我们真的有兴趣将优化推向极限。 所有系统将在相对较新的硬件(Intel i5或i7)上运行Debian / Linux。 问题 使用g ++的最新版本的可能的优化选项是什么,超越-O3 / -Ofast? 我们也对昂贵的小规模优化感兴趣,从长远来看这将是支出。 我们现在使用什么 现在我们使用下面的g ++优化选项: -Ofast :最高“标准”优化级别。 包括-ffast-math计算在我们的计算中没有造成任何问题,所以我们决定去做,尽pipe不符合标准。 -march=native :启用所有CPU特定指令。 -flto允许在不同的编译单元中优化链接时间。

Visual Studio 2015更新3 – C ++编译器错误?

我们观察到一个奇怪的情况,在VS2015 Update3编译器中将会忽略部分代码,原因不明。 我们发现了这一点 这发生在VS2015 Update3(帮助|关于说14.0.25431.01更新3,cl.exe版本19.00.24215.1) 这不会发生在VS2015 Update2(帮助|关于说14.0.25123.00更新2,cl.exe版本19.00.23918) 只有打开优化时才会发生这种情况(例如,在默认的“发行”configuration中) 在x86和x64中都会发生 将代码片段插入全新的“Win32控制台应用程序”(我的意思是,没有花哨的命令行选项要求) 我们设法最小化这个片段的罪魁祸首代码: #include <stdio.h> #include <tchar.h> #include <stdlib.h> int _tmain(int, _TCHAR*[]) { volatile int someVar = 1; const int indexOffset = someVar ? 0 : 1; // Loop omitted // const int indexOffset = !someVar; // Loop omitted // const int indexOffset = 0; // Good […]

为什么这个未使用的variables没有被优化?

我和Godbolt的CompilerExplorer玩过。 我想看看某些优化有多好。 我最低工作的例子是: #include <vector> int foo() { std::vector<int> v {1, 2, 3, 4, 5}; return v[4]; } 生成的汇编程序(由clang 5.0.0,-O2 -std = c ++ 14): foo(): # @foo() push rax mov edi, 20 call operator new(unsigned long) mov rdi, rax call operator delete(void*) mov eax, 5 pop rcx ret 正如人们所看到的,铿锵知道答案,但在返回之前做了很多事情。 在我看来,即使vector是创build,因为“运营商新/删除”。 任何人都可以向我解释这里发生了什么,为什么它不只是返回? 由GCC生成的代码(不在这里复制)似乎明确地构造了向量。 有谁知道GCC不能推断出结果?

从GCC获取优化报告

我想知道是否有一个选项可以和GCC一起使用,以获得编译器实际select和执行的优化的详细报告。 英特尔C编译器使用-opt-report可以实现这一点。 我不想看看汇编文件,并找出优化。 我正在寻找编译器select的循环展开和循环平铺系数。

C / C ++中const提供了哪种优化? (如果有的话)

我知道在可能的情况下,应该在通过引用传递参数时使用const关键字,或者出于可读性原因使用指针。 如果我指定参数是常量,编译器可以做什么优化? 可能有几种情况: function参数: 常量引用: void foo(const SomeClass& obj) 常量SomeClass对象: void foo(const SomeClass* pObj) 和SomeClass的常量指针: void foo(SomeClass* const pObj) variables声明: const int i = 1234 函数声明: const char* foo() 什么样的编译器优化每个提供(如果有的话)?

C#编译器是否删除了封装了debug.writeline的if

我有这样一段代码: if (state != "Ok") { Debug.WriteLine($"Error occured: {state}, {moreInfo}"); } 如果我发布版本,编译器是否优化了这一点? 还是评估停留,从而花费一些处理时间?

不同的优化级别可以导致function上不同的代码?

我很好奇编译器在优化时的自由度。 让我们把这个问题限制在GCC和C / C ++(任何版本,任何标准的味道): 是否有可能编写的行为有所不同取决于编译的优化级别? 我想到的例子是在C ++中的各种构造函数中打印不同的文本位,并根据是否复制副本(虽然我还没有能够做出这样的工作)而有所不同。 计数时钟周期是不允许的。 如果你有一个非GCC编译器的例子,我也会好奇的,但是我不能检查它。 在C中的例子的奖励积分:-) 编辑:示例代码应符合标准,从一开始就不包含未定义的行为。 编辑2:已经有一些很好的答案! 让我来看看这个代码:代码必须是一个结构良好的程序,并且是符合标准的,它必须编译来纠正每个优化级别的确定性程序。 (不包括forms不规则的multithreading代码中的种族条件)。另外,我赞赏浮点舍入可能会受到影响,但我们打折。 我只打了800的声望,所以我觉得我要把第一个完整的例子中的50个声望作为赏金,以符合这些条件的精神; 25如果涉及滥用严格的走样。 (有人告诉我如何把赏金送给别人。)

使用整数算术可以实现按位运算符吗?

我面临一个相当奇怪的问题。 我正在编写一个不支持按位操作的体系结构的编译器。 然而,它处理有符号的16位整数算术,我想知道是否有可能实现按位操作只使用: 加法 ( c = a + b ) 减法 ( c = a – b ) 分部 ( c = a / b ) 乘法 ( c = a * b ) 模量 ( c = a%b ) 最小值 ( c = min(a,b) ) 最大值 ( c = max(a,b) ) 比较 ( […]

在C ++编译器输出中使用“xor eax,ebp”

我只是在VS2010上编译了一些C ++代码片段,并分析了IDA Pro上的可执行文件。 我注意到的是,他们中的大多数在开始时具有类似于以下内容的东西(在调用__security_check_cookie之后不久) xor eax, ebp 和类似的东西 xor ecx, ebp 在底部。 为什么会这样呢? 编译器优化已closures。

反向迭代器在优化时返回垃圾

我有一个AsIterator模板类,它采用类似数字的types,在本例中只是一个int ,并将其转换为一个迭代器( ++和–递增和递减数字, operator*只是返回一个引用)。 这工作正常, 除非它被包装到一个std::reverse_iterator和编译与任何优化 ( -O是足够的)。 当我优化二进制文件时,编译器会reverse_iterator对reverse_iterator的解引用调用,并用一些奇怪的值replace它。 必须指出,它仍然会进行正确的迭代次数 。 这只是反向迭代器获得的值是垃圾。 考虑下面的代码: #include <iterator> #include <cstdio> template<typename T> class AsIterator : public std::iterator<std::bidirectional_iterator_tag, T> { T v; public: AsIterator(const T & init) : v(init) {} T &operator*() { return v; } AsIterator &operator++() { ++v; return *this; } AsIterator operator++(int) { AsIterator copy(*this); ++(*this); […]