gpt4 book ai didi

c++ - 编译器优化创建系统调用?

转载 作者:搜寻专家 更新时间:2023-10-31 01:04:36 25 4
gpt4 key购买 nike

我正在以两种模式编译一个相当复杂的应用程序:调试和发布。在我看来,主要区别在于 -O0 与 -O3(如果需要,我可以提供 makefile 的相关部分)。我试图尽可能避免系统调用生成,因为我在系统调用仿真模式下模拟这个应用程序(没有在下面运行的操作系统)。我目前遇到的问题是,在 Release模式下,编译器会生成一个额外的套接字系统调用,我不希望发生这种情况(在 Debug模式下不会发生)。

我认为可能会创建套接字的原因是我正在使用 pthreads 并且我的两个线程正在通过 volatile char* 进行通信。所以我猜当我设置 -O3 标志时,编译器可能试图以一种奇特的方式实现它?但我不确定这是否是一个合理的假设。

  1. 是否可能由于 -O3 标志而生成了套接字系统调用? (没有太多意义)
  2. 如果是这样,我如何提示编译器避免生成此系统调用?

编辑:顺便说一句,代码是用 C 和 C++ 编写的

编辑:代码静态链接到以下共享库:

libstdc++.a 
libm.a
libglib-2.0.a
-static-libgcc
*special pthreads library*

另外,我在二进制文件中找到了对 socket 的调用发生的位置:

8c716:       db28            blt.n   8c76a <openlog_internal+0xf2>
8c718: f8d9 1008 ldr.w r1, [r9, #8]
8c71c: 4620 mov r0, r4
8c71e: 2200 movs r2, #0
8c720: f441 2100 orr.w r1, r1, #524288 ; 0x80000
8c724: f001 e97c blx 8da20 <__socket>
8c728: 4b20 ldr r3, [pc, #128] ; (8c7ac <openlog_internal+0x134>)
8c72a: 681b ldr r3, [r3, #0]
8c72c: f8c9 0004 str.w r0, [r9, #4]
8c730: b943 cbnz r3, 8c744 <openlog_internal+0xcc>
8c732: 1c43 adds r3, r0, #1

编辑:我发现了为什么会这样(见下面我的回答)。如果有人对为什么编译器的行为有这样的解释,请分享!!!

最佳答案

虽然,可以想象这样一种优化,但我没有听说过,我真的很怀疑,因为任何系统调用通常都非常昂贵。

如果您使用的是 *nix 系统,您可以通过使用 nm 查找 undefined symbol 来验证它。

nm -u file1.o file2.o | grep socket

应该在某处显示丢失的 socket 符号为

        U socket

如果某处有对套接字的调用。

正如我提到的,我怀疑是否存在插入任何系统调用的优化,我希望上面的命令行没有输出。

更新:

在我的系统(Ubuntu 12.04,gcc 4.6)上,我在 man gcc 中发现了以下注释

-O2 Optimize even more. ...
NOTE: In Ubuntu 8.10 and later versions, -D_FORTIFY_SOURCE=2 is set by default, and is activated when -O is set to 2 or higher. This enables additional compile- time and run-time checks for several libc functions. To disable, specify either -U_FORTIFY_SOURCE or -D_FORTIFY_SOURCE=0.

因此,也许通过这种或类似的机制,当优化设置为 -O2-O3 时包含一些代码。

关于c++ - 编译器优化创建系统调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23639449/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com