compiler-optimization 相关问题

编译器优化涉及调整编译器以减少运行时或对象大小或两者。这可以使用编译器参数(即CFLAGS,LDFLAGS),编译器插件(例如DEHYDRA)或对编译器的直接修改(例如修改源代码)来实现。

我可以告诉 QB64 编译器*不*优化我的代码吗?

我想实验各种算法的效率,而编译器优化是一个障碍。我可以在 QB64 中禁用编译器优化吗?

回答 1 投票 0

-O 和 -wrap 的行为

我正在尝试使用 -wrap=symbol 来模拟函数进行单元测试,并且根据传递的 GCC 优化标志发现不同的行为 考虑下面的示例程序 #包括 我正在尝试使用 -wrap=symbol 来模拟函数进行单元测试,并且根据传递的 GCC 优化标志发现不同的行为 考虑下面的示例程序 #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <assert.h> void * __wrap_malloc(size_t sz) { printf("Called %s", __func__); return (void *) 0xDEADBEEF; } int main() { void *ptr; ptr = malloc(10); assert(0xDEADBEEF == (unsigned int)(uintptr_t)(ptr)); return 0; } 使用优化时 ❯ gcc -Os -Wl,-wrap=malloc 1.c -o opt ❯ ./opt opt: 1.c:16: main: Assertion `0xDEADBEEF == (unsigned int)(uintptr_t)(ptr)' failed. [1] 12546 abort ./opt 未经优化 ❯ gcc -Wl,-wrap=malloc 1.c -o without_opt ❯ ./without_opt Called __wrap_malloc 我尝试反汇编可执行文件 优化 0000000000400450 <main>: 400450: 48 83 ec 08 sub $0x8,%rsp 400454: b9 20 06 40 00 mov $0x400620,%ecx 400459: ba 10 00 00 00 mov $0x10,%edx 40045e: be ea 05 40 00 mov $0x4005ea,%esi 400463: bf ee 05 40 00 mov $0x4005ee,%edi 400468: e8 d3 ff ff ff callq 400440 <__assert_fail@plt> 40046d: 0f 1f 00 nopl (%rax) 未经优化 000000000040053e <main>: 40053e: 55 push %rbp 40053f: 48 89 e5 mov %rsp,%rbp 400542: 48 83 ec 10 sub $0x10,%rsp 400546: bf 0a 00 00 00 mov $0xa,%edi 40054b: e8 c7 ff ff ff callq 400517 <__wrap_malloc> 400550: 48 89 45 f8 mov %rax,-0x8(%rbp) 400554: 48 8b 45 f8 mov -0x8(%rbp),%rax 400558: 3d ef be ad de cmp $0xdeadbeef,%eax 40055d: 74 19 je 400578 <main+0x3a> 40055f: b9 4e 06 40 00 mov $0x40064e,%ecx 400564: ba 10 00 00 00 mov $0x10,%edx 400569: be 0a 06 40 00 mov $0x40060a,%esi 40056e: bf 10 06 40 00 mov $0x400610,%edi 400573: e8 c8 fe ff ff callq 400440 <__assert_fail@plt> 400578: b8 00 00 00 00 mov $0x0,%eax 40057d: c9 leaveq 40057e: c3 retq 40057f: 90 nop 没有调用wrap_malloc。看起来已经优化了。然后我尝试添加打印语句 int main() { void *ptr; ptr = malloc(10); >> printf("0x%x\n", (uintptr_t)ptr); assert(0xDEADBEEF == (unsigned int)(uintptr_t)(ptr)); return 0; } ❯ gcc -Os -Wl,-wrap=malloc 1.c -o print_opt ❯ ./print_opt Called __wrap_malloc0xdeadbeef print_opt: 1.c:17: main: Assertion `0xDEADBEEF == (unsigned int)(uintptr_t)(ptr)' failed. [1] 31575 abort ./print_opt 现在我看到包装的函数被调用。但断言失败了 0000000000400450 <main>: 400450: 48 83 ec 08 sub $0x8,%rsp 400454: bf 0a 00 00 00 mov $0xa,%edi 400459: e8 f9 00 00 00 callq 400557 <__wrap_malloc> 40045e: bf 0a 06 40 00 mov $0x40060a,%edi 400463: 48 89 c6 mov %rax,%rsi 400466: 31 c0 xor %eax,%eax 400468: e8 c3 ff ff ff callq 400430 <printf@plt> 40046d: b9 48 06 40 00 mov $0x400648,%ecx 400472: ba 11 00 00 00 mov $0x11,%edx 400477: be 10 06 40 00 mov $0x400610,%esi 40047c: bf 14 06 40 00 mov $0x400614,%edi 400481: e8 ba ff ff ff callq 400440 <__assert_fail@plt> 400486: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 40048d: 00 00 00 有人可以帮助我理解为什么/如何看到这种行为吗?预先感谢 对于 gcc,malloc() 被视为所谓的 “内置”函数,优化器会意识到并专门处理它(例如,它可以对其返回值做出某些假设,这会导致它自动失败)断言而不需要对其进行运行时测试)。如果您将 -fno-builtin-malloc 添加到编译选项中,则该特殊处理将被禁用: $ gcc -Os -fno-builtin-malloc -Wl,-wrap=malloc 1.c -o opt $ ./opt Called __wrap_malloc

回答 1 投票 0

[[假设]] 属性对代码没有影响

我希望下面的multiply_by_pow_of_2函数有一个更优化的乘法代码,因为我使用了[[假设(std::has_single_bit(multiplier))]];这应该告诉

回答 1 投票 0

C++ 中使用 std::vector 进行转义分析

我想知道 Clang 或 GCC 中是否有任何优化选项可用于对 C++ 中的 std::vector 进行转义分析。 由于下面示例中的 std::vector 不需要 v 的实际数据...

回答 2 投票 0

Twincat 3 / Codesys / PLC 代码优化(进行 OOP 时)

我从 PLC 编程开始,特别是使用 Beckhoff Twincat 3,我拥有 C/C++ 嵌入式编程背景和一些用于跨平台开发的 C# 背景。 我发现了

回答 1 投票 0

实现闭包和性能影响,例如相对与绝对跳跃

不久前,我在编译器类中学习了闭包转换,并且想知道调用闭包与调用函数会产生多少性能开销。 考虑一个函数

回答 1 投票 0

相对跳跃与绝对跳跃的表现

不久前,我在编译器类中学习了闭包转换,并且想知道调用闭包与调用函数会产生多少性能开销。 考虑一个函数

回答 1 投票 0

为什么这个程序在Linux上比在Windows上慢很多?

我尝试在 Linux 上运行这段代码,但我发现它在 Linux 上的运行速度比在 Windows 上慢 2 倍到 3 倍。使用其官方输入示例 data/BS_1000_torus.xyz,在 Windows 上需要大约 20 秒,但在 Linux 上......

回答 1 投票 0

我应该使用哪个选项来设置 CMake 中的编译器选项?

我注意到似乎有两种方法可以在 CMake 文件中设置编译器选项: target_compile_options(${TargetName} PRIVATE "-O3") 或者 设置(CMAKE_CXX_FLAGS“${CMAKE_CXX_FLAGS} -O3&qu...

回答 1 投票 0

Lua 在发出字节码时如何利用 <const>?

我正在摆弄 Lua 并使用 https://www.luac.nl/ 来看看它如何转换为字节码。我想看看是否有类似 if boolean_always_true then ... end 的模式,布尔值是用 <...

回答 1 投票 0

应用程序未在发布模式下进入 Posix 信号处理程序

我正在尝试在 Linux Arm 设备上正常关闭我的控制台应用程序。发送的信号是 SIGTERM。我使用新的 PosixSignalRegistration.Create() 实现了 Posix Sgnal Handler

回答 1 投票 0

为什么 GCC 和 Clang 会在两个分支上弹出而不是只弹出一次?

GCC 和 Clang 都可以编译 布尔预测(); 无效 f(); 无效 g(); 无效 h() { 如果(预测()){ F(); } 别的 { G(); } } 到一些变化 # Clang -Os 输出。 -O3是一样的 哈...

回答 1 投票 0

我应该使用哪些 gcc 优化标志?

如果我想最小化我的C程序运行时间,我应该使用什么优化标志(我也想保持标准) 目前我正在使用: -墙 -Wextra -迂腐 -ansi -O3 我也应该使用...

回答 3 投票 0

MSVC c++ 中 Release 模式与 Release + O2 模式之间的区别

在 Visual Studio 中,为了加快我的程序速度,我调整了两件事: 第一个是将Debug模式变成Release模式。 第二个是打开-O2(所以必须关闭

回答 1 投票 0

编译器可以优化不依赖于for循环变量的for循环中的计算吗?

假设我有一个看起来像这样的热循环(它是用 C 语言编写的,但这个问题通常适用于编译命令式语言): int max_dist = some_value; 对于 (int x = min_x; x <= max_x; +...

回答 1 投票 0

C编译器是否必须将&&和||短路没有必要吗?

C 短路&& 和||。 与按位 | 不同运算符,||运算符保证从左到右评估;如果计算第二个操作数,则

回答 1 投票 0

改进 g++ 编译器标志以进行调试和发布

我正在使用 sdl2 用 c++ 制作游戏,目前正在使用以下标志使用 g++ 编译程序: DEBUG_FLAGS = -g -Og -DDEBUG RELEASE_FLAGS = -O3 -DNDEBUG -mwindows -s 我想要...

回答 1 投票 0

为什么 Rust 不重新排序枚举中的字段以进行内存布局?

我知道 Rust 结构中的字段会自动重新排序以节省内存(除非指定了 #[repr(C)])。 我假设枚举也是如此。 今天我正在创建一个

回答 1 投票 0

调用带有取消引用指针的引用的函数的成本是多少?

在以下类型的代码中从指针转换为 ref 是否有任何成本? 空栏(Obj&); 无效 foo(Obj* o) { 酒吧(*o); } 一方面,指针的值是Obj的地址,...

回答 1 投票 0

Avx2 内在函数不使用所有可用的寄存器。 .NET 8

我使用 SIMD 优化了某些算法,使得它们与 L1 缓存相比具有延迟限制。由于只有 C# 编译器知道的原因, said 莫名其妙地发出只使用 ym 的代码...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.