我正在以两种模式编译一个相当复杂的应用程序:调试和发布。在我看来,主要区别是 -O0 与 -O3 (如果需要,我可以提供 makefile 的相关部分)。我试图尽可能避免系统调用生成,因为我正在系统调用模拟模式下模拟此应用程序(下面没有运行操作系统)。我当前遇到的问题是,在发布模式下,编译器会生成一个额外的套接字系统调用,我不希望发生这种情况(并且在调试模式下也不会发生)。
我认为可能创建套接字的原因是我正在使用 pthreads 并且我的两个线程正在通过 易失性 char* 进行通信。所以我猜测当我设置 -O3 标志时编译器可能试图以一种奇特的方式实现它?但我不确定这是否是一个合理的假设。
编辑:顺便说一句,代码是用 C 和 C++ 编写的
编辑:代码静态链接到以下共享库:
libstdc++.a
libm.a
libglib-2.0.a
-static-libgcc
*special pthreads library*
Run Code Online (Sandbox Code Playgroud)
另外,我发现二进制文件中发生对套接字的调用的位置:
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: …
Run Code Online (Sandbox Code Playgroud) 我试图拆分一个巨大的文本文件(约5亿行文本),这是非常规则的,看起来像这样:
-- Start ---
blah blah
-- End --
-- Start --
blah blah
-- End --
...
Run Code Online (Sandbox Code Playgroud)
其中......暗示重复模式,"blah blah"具有可变长度~2000行.我想分开第一个
-- Start --
blah blah
-- End --
Run Code Online (Sandbox Code Playgroud)
阻塞到一个单独的文件并从FASTEST中的原始文件中删除它(运行时,给定我将运行这么多次)可能的方式.
理想的解决方案是从原始文件中删除初始块并将其粘贴到新文件中,而不加载巨大的初始文件的尾部.
我用以下方式尝试了csplit:
csplit file.txt /End/+1
Run Code Online (Sandbox Code Playgroud)
这是一种有效的方法,但在时间上效率不高.
编辑:如果我们从文件中删除最后一个"开始结束"块而不是第一个块,是否有解决方案?