compiler-optimization相关内容
给出类似的命令 perl -MO = Deparse -E'use constant FOO =>42;打印FOO()' 如何禁用这样的恒定折叠 打印42; 告诉我 print FOO(); 之类的.理想情况下,我希望这是一个适用于所有Perl的编译器选项.您可以在perl邮件列表 [perl#97942] [PATCH]添加 -DO 选项以禁用优化,并禁用常量折叠和窥视孔优
..
我试图查看 Roslyn 如何优化以下代码段: 代码 public int F(int n){++ n;++ n;++ n;++ n;返回n;} asm C.F(Int32)L0000:INC EDXL0002:Inc edxL0004:公司EDXL0006:公司EDXL0008:MOV EAX,EDXL000a:后退 问题 为什么Roslyn不能像MSVC这样的提前C
..
我正在阅读库(QNNPack)的源代码并注意到这一行(
..
我最近一直在尝试重新熟悉多线程,并发现
..
我正在尝试创建尽可能小的ELF.我创建了这样的测试文件(NASM语法): SECTION .textdd 0xdeadbeef 使用此链接描述文件: SECTIONS {.文本 : {*(.文本)}} 然后我检查了平面二进制文件和ELF的大小,构建了两种方法: nasm -f bin -o test test.asm 它是平面二进制,所以是4个字节. nasm -f e
..
实现同一功能的多个版本的最佳方法是使用特定的CPU指令(如果在运行时进行了测试),或者如果使用慢的实现则回退到较慢的实现? 例如,x86 BMI2提供了非常有用的 PDEP 指令.我将如何编写C代码,以便在启动时测试正在执行的CPU的BMI2可用性,并使用两种实现方式之一-一种使用 _pdep_u64 调用(可用于 -mbmi2 ),另一个使用C代码“手动"进行位操作.是否有针对此类情况的内置支
..
If语句和任何其他布尔比较很聪明,足以在评估 A和B以及C和D 时停止在第一个FALSE值,而在评估 A或B或第一个TRUE值时停止C或D . 此行为的名称是什么? 这是编译器优化吗?如果是这样,是否有一种方法可以通过一些编译器指令将其禁用? 解决方案 这称为“布尔短路评估",是“惰性评估"的一种形式. 您可以使用
..
我正在对循环计数中的一些计数进行基准测试.g ++与-O2代码一起使用,我注意到当在50%的情况下满足某些条件时,它会出现一些性能问题.我认为这可能意味着代码会进行不必要的跳转(因为clang会生成更快的代码,所以这不是一些基本的限制). 我在这个汇编输出中发现有趣的是,代码跳过了一个简单的添加. =>0x42b46b
..
我查看了这个问题试图更好地理解scala中的 @tailrec 注释. 我不确定是注解是否还提示编译器进行了一些优化,还是仅在标记了非尾递归的方法时才用于警告? 更具体地说-此注释是否可能以任何方式影响性能?例如,如果我不添加此批注,则编译器会将尾递归函数编译为非尾递归吗? 解决方案 根据scaladoc: 方法批注,用于验证将要编译的方法带有尾部呼叫优化功能. 如
..
合理的体面的编译器能否丢弃此const静态变量 A类{const static int a = 3;} 如果编译后的二进制文件中没有使用它,或者二进制文件中仍然显示它? 解决方案 简短答案:也许可以.该标准没有说如果从未使用过编译器,则它必须保留常量(或字符串,函数,或其他任何东西). 长答案:这在很大程度上取决于具体情况.如果编译器可以清楚地确定未使用它,它将删除未使用的常
..
我试图查看一个非常简单的程序的汇编代码. int func(int x){int z = 1337;返回z;} 使用GCC -O0,每个C变量都有一个未优化的内存地址,因此gcc溢出了其寄存器arg:(红色区域是否超出了必要?难道这不能触及本叶子函数无法触及的新缓存行吗? 解决方案 (首先,不要期望在 -O0 处做出有效的决定.事实证明,您在如果我们使用 volatile 或其他方
..
我对编程还很陌生,想问为什么我用不同的代码会得到相同的结果.我实际上是在读一本书,而本书中的示例是使用printf的(同样在Assembler中).在这种情况下,它说 .本书中的汇编代码与我的不同,但C代码相同.我的处理器只是在计算不同吗? (问题在通话中 ) 代码1: #includein
..
事实: javac 被编程为检测变量是否为 final 或是否可以有效地视为 final . 证明: 此代码对此进行了说明. public static void finalCheck(){字符串str1 ="hello";可运行r =()->{str1 ="hello";};} 由于编译器能够检测到 String 引用 str1 在函数中被重新分配,因此无法编译.
..
我正在3D网格中处理大量数据,因此我想实现一个简单的迭代器,而不是三个嵌套循环.但是,我遇到了一个性能问题:首先,我仅使用int x,y和z变量实现了一个简单的循环.然后,我实现了Vector3I结构并使用它-计算时间加倍.现在,我正在为这个问题而苦苦挣扎-为什么呢?我做错了什么? 复制示例: 使用BenchmarkDotNet.Attributes;使用BenchmarkDotNet.R
..
请参阅以下 SE答案. 写作时 A = A ??B; 与 相同 if(null!= A)A = A;别的A = B; 那是不是 if(null == A)A = B; 在性能方面会更受欢迎吗? 还是我可以假设当同一对象位于 ?? 表示法中时,编译器会优化代码吗? 解决方案 尽管 ?? 的性能可以忽略不计,但有时副作用却可以忽略不计.请考虑以下程序.
..
以下是一些简单的Java代码: String s = new StringBuilder().append("a").append("b").append("c").toString(); 我使用JRE 1.6进行编译,并且在反编译的类文件中观察到以下内容: 字符串s ="a" +"b" +"c"; 我有以下问题: 为什么编译器会在StringBuilder上选择'+'? 我
..
考虑以下简单示例: struct __attribute__((__packed__)){整数代码[1];int place_holder [100];} s;无效测试(int n){我对于(i = 0; i的
..
我可以使用GCC将汇编代码文件转换为可重新分配的文件. gcc -c source.S -o object.o -O2 优化选项是否有效?我可以期望GCC来优化我的汇编代码吗? 解决方案 否. GCC将您的汇编源传递给预处理器,然后传递给汇编器.任何时候都不会进行任何优化.
..
下面是函数的代码,该函数检查为其指定的行和列“坐标"对于将指针传递给它的文件是否有效. 混乱的12小时后,我不知道为什么这样随机. 在自己的源文件上运行此命令时,它会在任何大于 10 的列值上引发错误.我假设一些过分热情的编译器优化将 q 计数变量和 chk 变量并置,并且由于'\ n'具有十进制val 10 ,打破了我的循环. 假设,我尝试使用GCC进行编译(以前我使用的是Ap
..
出于好奇,我想知道gcc是否可以通过某种方式不优化任何函数调用? 在生成的汇编代码中,将printf函数替换为putchar.即使使用默认的 -O0 最小优化标志,也会发生这种情况. #includeint main(void){printf("a");返回0;} (这就是 -O0 的真正含义);gcc没有尝试完全将C音译为asm的“完全哑"模式.为此使用 tcc
..