compiler-optimization相关内容

Shapeless 中 Nat 类型的限制

在 shapeless 中,Nat 类型代表了一种在类型级别对自然数进行编码的方法.例如,这用于固定大小的列表.您甚至可以在类型级别上进行计算,例如将 N 元素列表附加到 K 元素列表并返回在编译时已知具有 N+K 元素的列表. 这种表示是否能够表示大数,例如1000000 或 253,还是会导致 Scala 编译器放弃? 解决方案 我会自己尝试一个.我很乐意接受 Travis Br ..
发布时间:2022-01-17 09:21:30 其他开发

允许编译器优化异常抛出吗?

我们今天在工作中一直在讨论这个话题,但我们谁也无法对这个问题给出明确的答案.考虑以下情况: int foo(){内部错误;错误 = some_call(1);如果(错误!= 0)返回错误;错误 = some_call(2);如果(错误!= 0)返回错误;错误 = some_call(3);如果(错误!= 0)返回错误;错误 = some_call(4);如果(错误!= 0)返回错误;酒吧();返 ..

C/C++ 编译器如何工作?

经过十多年的 C/C++ 编码,我注意到以下模式 - 非常优秀的程序员往往对编译器的内部有详细的了解. 我是一个相当优秀的程序员,我有一个特别的编译器“迷信"集合,所以我想重新认识我的知识并从基础开始. 谁能推荐在线资源或喜爱书籍的链接?我对 C/C++ 编译、优化、GCC 和 LLVM 特别感兴趣. 解决方案 从龙书入手....(更注重代码优化和代码生成) 继续为诸如 ..
发布时间:2022-01-17 08:43:17 C/C++开发

是否可以保证不会在 C++ 中优化执行内存写入的代码?

允许 C++ 编译器优化写入内存: {//所有这些代码都可以去掉字符缓冲区[大小];std::fill_n(缓冲区,大小,0);} 在处理敏感数据时,典型的方法是使用 volatile* 指针来确保编译器发出内存写入.下面是 Visual C++ 运行时库 (WinNT.h) 中的 SecureZeroMemory() 函数的实现方式: FORCEINLINE PVOID RtlSecur ..

当我们有编译器时,为什么我们甚至需要汇编器?

如果编译器将高级语言转换为机器代码,为什么我们还需要汇编器?是否有任何汇编级语言,我们不能为此使用编译器? 解决方案 相关:编译器是否总是生成汇编代码? - 更多关于为什么某些编译器确实只编译为 asm,而不是直接编译为某些目标文件格式的机器代码.编译为 asm 而不是机器代码有几个原因使编译器的工作更容易并且编译器更容易移植.但是编译器并不是 asm 存在的唯一原因. 为什么我们甚 ..

链接构造函数时,JVM 的隐式内存屏障如何表现?

参考我的之前关于不完全构造对象的问题,我有一个第二个问题.正如 Jon Skeet 指出的那样,构造函数末尾有一个隐式内存屏障,可确保 final 字段对所有线程都是可见的.但是如果一个构造函数调用另一个构造函数呢?他们每个人的末尾是否有这样的内存屏障,或者仅在首先被调用的那个末尾?也就是说,当“错误"的解决方案是: 公共类 ThisEscape {public ThisEscape(Event ..

有没有办法关闭 JIT 编译器,这样做会影响性能吗?

JIT 对 Java 程序意味着什么?它是否使执行速度更快?或者是否有不是 JIT 的字节码? 解决方案 有两种方法可以禁用 JIT -Djava.compiler=NONE 否则这几乎不会编译任何东西 -XX:CompileThreshold=2000000000 或在 IBM JVM 上 -nojit 禁用 JIT 会大大降低您的代码速度,例如50 倍,但并非总是如此.如果 ..
发布时间:2022-01-16 12:16:31 其他开发

Hotspot 什么时候可以在栈上分配对象?

从 Java 6 左右开始,Hotspot JVM 可以进行转义分析,并在堆栈上而不是在垃圾收集堆上分配非转义对象.这会加快生成的代码并减少垃圾收集器的压力. Hotspot 何时能够堆栈分配对象的规则是什么?换句话说,我什么时候可以依靠它来进行堆栈分配? 编辑:这个问题是重复的,但是(IMO)下面的答案比原始问题的答案更好. 解决方案 我做了一些实验,看看 Hotspot 什 ..

MPI Fortran 编译器优化错误

尽管编写了长且高度并行化的代码,并在三维数组上进行了复杂的发送/接收,但这个包含二维整数数组的简单代码让我大吃一惊.我梳理了 stackoverflow 以寻找可能的解决方案,发现一个与我遇到的问题略有相似的解决方案: Boost.MPI:收到的不是发送的! 但是,解决方案似乎将循环代码段作为覆盖内存部分的罪魁祸首.但这一个似乎表现得更奇怪.也许这是我对一些简单细节的粗心疏忽.问题在于 ..
发布时间:2022-01-14 09:55:53 其他开发

由于未定义的行为或编译器错误导致 C++ 代码崩溃?

我遇到了奇怪的崩溃.我想知道这是否是我的代码或编译器中的错误.当我使用 Microsoft Visual Studio 2010 编译以下 C++ 代码作为优化版本构建时,它在标记的行中崩溃: struct tup { int x;整数y;};C类{上市:结构 tup* p;struct tup* operator--() { return --p;}struct tup* operator++ ..

C中的浮点运算是关联的吗?

加法在数学上保持关联属性: (a + b) + c = a + (b + c) 在一般情况下,此属性不适用于浮点数,因为它们以有限精度表示值. 在从 C 程序生成机器代码作为优化的一部分时,是否允许编译器进行上述替换?它在 C 标准中的确切位置是什么? 解决方案 不允许编译器执行“优化",这将导致计算的值与根据抽象机器语义计算的值不同. 5.1.2.3 程序执行 [# ..
发布时间:2022-01-09 10:28:02 其他开发

如何让 GCC 在没有内置函数的情况下为大端存储生成 bswap 指令?

更新:此问题已在 GCC 8.1 中修复. 我正在研究一个以大端格式将 64 位值存储到内存中的函数.我希望我可以编写可在小端和大端平台上运行的可移植 C99 代码,并让现代 x86 编译器自动生成 bswap 指令而无需任何内置或内在函数.所以我从以下功能开始: #include 空白encode_bigend_u64(uint64_t 值,void *vdest){uint8_t *b ..
发布时间:2022-01-06 13:12:13 其他开发

我的 x86 目标文件中这些看似无用的 callq 指令是做什么用的?

我有一些模板密集的 C++ 代码,我想确保编译器尽可能地优化,因为它在编译时拥有大量信息.为了评估它的性能,我决定看一看它生成的目标文件的反汇编.下面是我从 objdump -dC 得到的片段: 0000000000000000 ::get(bool)>:0: 41 57 推 %r152: 49 89 f7 mov %rsi,%r155: 41 56 推 %r147: 41 55 推 %r139 ..
发布时间:2022-01-06 13:06:27 C/C++开发

为什么 std::fill(0) 比 std::fill(1) 慢?

我在一个系统上观察到 std::fill 在大型 std::vector 上设置常量值时明显且始终较慢 >0 与常量值 1 或动态值相比: 5.8 GiB/s 对比 7.5 GiB/s 然而,对于较小的数据大小,结果是不同的,其中 fill(0) 更快: 如果有多个线程,在 4 GiB 数据大小时,fill(1) 显示出更高的斜率,但达到的峰值比 fill(0) (51 ..
发布时间:2022-01-06 12:46:07 C/C++开发

为什么编译器将数据放在 PE 和 ELF 文件的 .text(code) 部分,CPU 如何区分数据和代码?

所以我参考这篇论文: 二元搅拌:自随机指令地址旧版 x86 二进制代码 https://www.utdallas.edu/~hamlen/wartell12ccs.pdf 代码与数据交错:现代编译器积极地交错PE 和 ELF 二进制文件中的代码段中的静态数据性能原因.在编译的二进制文件中,通常没有区分数据字节和代码的方法.不经意间将数据与代码一起随机化会破坏二进制文件,为指令级随 ..
发布时间:2022-01-06 12:34:17 其他开发

是否有 (Linux) g++ 等效于 Visual Studio 中使用的/fp:precise 和/fp:fast 标志?

背景: 许多年前,我继承了一个代码库,该代码库使用 Visual Studio (VC++) 标志“/fp:fast"在特定计算密集型库中生成更快的代码.不幸的是,'/fp:fast' 产生的结果与在不同编译器(Borland C++)下的同一个库略有不同.由于我们需要产生完全相同的结果,我切换到“/fp:precise",它运行良好,从那以后一切都变得很好.但是,现在我在 uBuntu L ..

我何时以及为什么要使用 -fno-elide-constructors?

我正在学习 C++ 并且遇到了 -fno-elide-constructors,下面我包含了手册页中的描述. -fno-elide-constructorsC++ 标准允许一个实现省略创建一个临时的,它只用于初始化另一个对象同类型.指定此选项会禁用该优化,并且强制 G++ 在所有情况下调用复制构造函数. 因此,使用此选项,我可以禁用这种特定类型的编译器优化.我有一个程序,它创建 2 个对象并 ..
发布时间:2022-01-04 21:55:09 C/C++开发

使用gcc时如何找出实际应用了哪些优化?

使用 IBM 的 XL 编译器系列,可以提供两个选项(-qreport 和 -qlist)来为每个源文件生成报告,其中包括有关哪些优化的信息应用,或者代码的哪些部分无法优化(以及为什么). 是否有可能为 GNU 的 g++ 获得类似的报告 - 如果是,如何做? 解决方案 看看 -fdump-tree-[switch] 标志.您可以使用 -fdump-tree-all 获取大量信息. ..
发布时间:2022-01-04 21:54:21 C/C++开发