compiler-optimization相关内容

将 32 位偏移量添加到 x86-64 ABI 的指针时是否需要符号或零扩展?

总结:我正在查看汇编代码来指导我的优化,并在将 int32 添加到指针时看到了很多符号或零扩展. void Test(int *out, int offset){出[偏移] = 1;}-------------------------------------movslq %esi, %rsimovl $1, (%rdi,%rsi,4)退 起初,我认为我的编译器在将 32 位整数添加到 64 位 ..

为什么 clang 使用 -O0 产生低效的 asm(对于这个简单的浮点和)?

我正在 llvm clang Apple LLVM version 8.0.0 (clang-800.0.42.1) 上反汇编此代码: int main() {浮动 a=0.151234;浮动 b=0.2;浮动 c=a+b;printf("%f", c);} 我编译时没有使用 -O 规范,但我也尝试使用 -O0(给出相同的值)和 -O2(实际上计算值并存储它预先计算的值) 拆解结果如下( ..
发布时间:2021-11-30 11:04:08 其他开发

C++:如何知道基类子对象的大小?

. 这里我在讨论空基优化,并且 MSalters 发表了这个有趣的评论: 没有一个班级可以有sizeof(Class)==0,是否为空.但是我们正在专门讨论空基类子对象的大小.它不需要自己的 vtable,也不需要一个虚表指针.假设常见的vtable 指针在偏移处的布局0;这将导致零大小基类子对象共享其带有派生类的 vtable 指针.没问题:那些应该是相同的无论如何,这就是重点虚函数 ..

C++:如何知道基类子对象的大小?

. 这里我在讨论空基优化,并且 MSalters 发表了这个有趣的评论: 没有一个班级可以有sizeof(Class)==0,是否为空.但是我们正在专门讨论空基类子对象的大小.它不需要自己的 vtable,也不需要一个虚表指针.假设常见的vtable 指针在偏移处的布局0;这将导致零大小基类子对象共享其带有派生类的 vtable 指针.没问题:那些应该是相同的无论如何,这就是重点虚函数 ..

我可以告诉 javac 忽略 `import foo.Bar` 的缺失吗?

我正在使用反射在运行时加载 MyClass.class(一个外部文件). MyClass.class 使用库 Bar,这意味着我需要将 import foo.Bar; 放在文件. 但是,Bar 库已经加载到加载 MyClass 的主类中. 有没有办法让我告诉 javac 忽略 Bar 不存在而直接编译没有它? 解决方案 不,这是不可能的.在编译一个类时,编译器没有“记忆" ..
发布时间:2021-11-22 16:28:50 Java开发

如何强制 IAR 使用所需的 Cortex-M0+ 指令(此功能的优化将被禁用.)

我需要强制 IAR tp 在我的代码的某些部分使用某些 Cortex-M0+ 指令,同时使用 C 进行编码. 请不要提供纯 asm 函数或内联 asm 等. 我已设法为 51 条指令执行此操作,但无法为 ;ADR、BLX、RSBS、SBCS、SXTH 指令. 禁用此功能的优化(#pragma optimization=none) 考虑到教学行为,我尝试了很多方法.但IAR更 ..
发布时间:2021-11-17 22:42:10 其他开发

g++ 编译器标志以最小化二进制大小

我有一个 Arduino Uno R3.我正在使用 C++ 为我的每个传感器制作逻辑对象.Arduino 的板载内存非常有限,只有 32KB*,平均而言,我编译的对象大约有 6KB*. 我已经在使用所需的尽可能小的数据类型,以尽量减少我的内存占用.是否有编译器标志来最小化二进制文件的大小,或者我是否需要使用更短的变量和函数名称、更少的函数等来最小化我的代码库? 此外,对于最小化二进制大 ..
发布时间:2021-11-17 03:35:19 C/C++开发

哪个更快?函数调用还是条件 if 语句?

在回答这个问题之前,请考虑分支预测. 我有一些场景,我可以在函数指针的帮助下用对函数的调用替换条件语句.类似这样的事情.(对于类似的场景,您可以考虑基于组件的编程而不是继承) 类形状{浮动区域(){如果(类型 == 平方){返回长度*长度;}否则如果(类型 == 矩形){返回长度*宽度;}}} 同一个类可以这样写. 类形状{void SetAreaFunction(void *fu ..

执行次数减少3倍,但执行效率几乎不变.在 C

在C中,我将循环执行总数减少了近3倍,但是通过测试执行时间,我发现这样做几乎没有任何改进.所有优化级别都经过测试,结果基本一致(包括O0、O1、O2和O3).我猜是编译器的问题,但我想知道是什么导致了这种情况.以及如何做才能使结果符合预期. 代码如下: #include #include #include #define Len 10000000//计算循环次数的两个变量int count ..
发布时间:2021-09-29 19:46:18 其他开发

是 mov rax,0x12345678;jmp rax 仍然会杀死分支预测?

我无法找到上述两种情况的特定信息,尽管听取了您的专家意见. 第一件事是:我知道间接 jmps 会损害分支预测,即使间接的结果是常数,它仍然需要预测维护缓冲区和东西,所有这些都与绝对 jmp 相比. 我的问题是,如果有人知道: mov rax, 1234567812345678h;jmp rax; 处理器的分支预测器仍然认为是间接的,或者在这种情况下它会做数学运算吗..我这样做是因为 ..

为什么 GCC 会发出“lea"?而不是“子"减法?

我正在查看通过反汇编一些 C 程序生成的一些程序集,但我对我经常看到重复的单个优化感到困惑. 当我在 GCC 编译器上没有优化时使用 subl 指令进行减法,但是当我打开优化时(-O3 准确地说)编译器使用 leal 指令代替减法,示例如下: 没有优化: 83 e8 01 subl $0x1, %eax 有优化 8d 6f ff leal -0x1(%edi), %ebp 这两 ..
发布时间:2021-09-29 19:36:07 其他开发

为什么添加立即调用的 lambda 会使我的 JavaScript 代码速度提高 2 倍?

我正在将一种语言的编译器优化为 JavaScript,并发现了一个非常有趣的案例: function add(n,m) {返回 n === 0 ?m : 添加(n - 1, m) + 1;};无功 s = 0;for (var i = 0; i 在我的机器上完成需要 2.3s[1].但是如果我做一个很小的改变: function add(n,m) {return (() => n === ..

通过完全理解现代 pc 架构,是否有可能获得比编译器更好的性能?

我知道现在很多编译器都非常擅长优化代码.但是,如果一个完全理解现代pc架构的人,是否有可能使代码比编译器更快?比如,如果他用 100% 的汇编编写代码,专注于架构呢?如果确实有所作为,是否值得? 解决方案 有时人类可以编写更好的代码,如果其中一些要求是真的: 人类需要有关目标架构的特定知识. 人类知道编译器的所有技巧,例如(左移而不是乘法). 此外,人类还需要了解很多关于汇编/处 ..
发布时间:2021-06-15 19:48:44 其他开发

std::min 与使用 #pragma GCC 优化(“O3")的三元 gcc 自动矢量化

我知道“为什么我的编译器要这样做"不是最好的问题类型,但这个问题对我来说真的很奇怪,我很困惑. 我原以为 std::min() 和手写的三元是一样的(可能还有一些编译时模板的东西),而且在正常使用时它似乎编译成相同的操作.然而,当试图做一个“min and sum"时loop autovectorize 它们似乎不一样,如果有人能帮我找出原因,我会很高兴.这是一个产生问题的小示例代码: # ..

查找Java方法的字节码大小

我试图弄清楚方法的字节码大小,因为我想确保它足够小,可以被编译器优化内联. 我看到内联方法的默认最大大小为35,因此如果该方法大于此,我将修改代码或将其分成多个方法. 我有一种生成下面的字节码的方法(通过IntelliJ IDEA的ASM字节码大纲插件进行反汇编). 如何知道该方法的字节码大小?LINENUMBER似乎引用了原始源代码的行号. 公共静态mergeNativeAr ..
发布时间:2021-05-18 20:26:09 Java开发

如何通过编译器设置(不是pragma' s)告诉GCC将结构大小边界设置为4个字节?

我希望在GCC下编译的c ++程序的最大对齐长度为4个字节(结构成员).我真的可以通过#pragma pack指令来做到这一点.但是,对于我来说,这很不舒服,因为该项目很大,而且我需要使用#pragma pack制作一个标头,该标头必须包含在所有地方.现在,gcc编译器具有-mstructure-size-boundary = n选项,在此处 ..