gpt4 book ai didi

c - 即使是最小的 .c 文件也总是编译成至少 128 KB 的可执行文件,这是有原因的吗?

转载 作者:太空宇宙 更新时间:2023-11-03 23:22:48 26 4
gpt4 key购买 nike

我在 Windows 8.1 64 位上使用 Dev-C++,它使用 GCC 编译。

我注意到我所有的 .c 文件总是被编译成至少 128 KB 的 .exe 文件,无论源代码有多小。即使是一个简单的“你好,世界!”是128kb。正如我所料,包含更多代码行的源文件增加了可执行文件的大小,但所有文件开始时至少有 128kb,好像这是某种最小大小。

我知道 .exe 实际上没有这样的最小大小; .kkrieger是一个完整的第一人称射击游戏,具有 3D 图形和声音,所有这些都适合一个 96kb 的可执行文件。

为了弄清楚这个问题,我在 Notepad++ 中打开了我的 hello_world.exe。我想,也许我的编译器添加了一个长头文件,恰好是 128kb。

不幸的是,我对可执行文件的了解还不够多,无法理解它,尽管我确实发现了诸如“地址 %p 没有图像部分 VirtualQuery 在地址 %p 的 %d 个字节失败”之类的字符串.exe 中常见的乱码。

当然,这不是一个严重的问题,但我想知道为什么会这样。

为什么会出现这个 128kb 的最小值?这是否与我的 64 位操作系统有关,或者可能与我的编译器的怪癖有关?

最佳答案

简短回答:视情况而定。

长答案:这取决于您拥有的操作系​​统及其处理可执行文件的方式。

大多数(如果不是全部)编程语言编译器不会将其分解为绝对的、原始的 x86/ARM/其他架构的机器代码。相反,在他们将您的源代码打包到 .o(目标)文件后,他们将 .o 及其库“链接”在一起,以形成标准的可执行格式。这些“可执行格式”本质上是特定于系统的文件格式,其中包含低级、非常接近机器代码的指令,操作系统以这种方式解释这些指令,以便将这些低级指令以以下形式中继到 CPU机器代码指令。

例如,我将讨论 Linux 设备最常用的两种可执行文件格式:ELF 和 ELF64(我会让您自己弄清楚它们的同名区别是什么)。 ELF代表可执行和可链接格式。在每个 ELF 编译的程序中,文件都以一个 4 字节的“魔数(Magic Number)”开头,它只是一个十六进制的 0x7F,后跟 ASCII 字符串“ELF”。下一个字节设置为 1 或 2,分别表示该程序适用于 32 位或 64 位体系结构。在那之后,另一个字节表示程序的 endianness.之后,还有几个字节说明架构是什么,依此类推,直到 64 位 header 总共达到 64 个字节。

但是,64 字节甚至不接近您所说的 128K。那是因为(除了 Windows .exe 格式通常要复杂得多这一事实之外),这里有 C++ 标准库的问题。例如,让我们看一下 C++ iostream 库的常见用法:

#include <iostream>
int main()
{
std::cout<<"Hello, World!"<<std::endl;
return 0;
}

此程序可能会在 Windows 系统上编译为一个非常大的可执行文件,因为当您将 iostream 添加到您的程序时,它会将整个 C++ 标准库添加到其中,从而极大地增加您的可执行文件的大小。

那么,我们该如何解决这个问题呢?简单的:使用 C++ 的 C 标准库实现!

#include <cstdio>
int main()
{
printf("Hello, World!\n");
return 0;
}

只需使用原始的 C 标准库即可将您的大小从几百 KB 减少到最多几千字节。发生这种情况的原因很简单,因为 GCC/G++ 出于某种奇怪的原因真的很喜欢将程序与整个标准 C++ 库链接。

但是,有时您绝对需要使用特定于 C++ 的库。在那种情况下,许多链接器都有某种命令行选项,这些选项基本上告诉链接器“嘿,我只使用 STDCPP 库中的 2 个函数,你不需要全部”。在 Linux 链接器 ld 上,这是命令行选项 -nodefaultlibs。不过,我不完全确定这在 Windows 上是什么。当然,这可以很快中断大量调用,以及在进行大量标准 C++ 调用的程序中进行的此类调用。

所以,最后,我更担心的是简单地重写您的程序以使用常规 C 函数而不是新奇的 C++ 函数,尽管它们很神奇。如果您担心尺寸。

关于c - 即使是最小的 .c 文件也总是编译成至少 128 KB 的可执行文件,这是有原因的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34757747/

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