【问题标题】:Can an exe be smaller than its largest declared buffer?exe 可以小于其声明的最大缓冲区吗?
【发布时间】:2011-01-17 22:02:36
【问题描述】:

我问的原因:

#include <string.h>

using namespace std;

int main()
{
    unsigned char file[512000];
    unsigned char key[512000];
    for(int i = 0; i < 512000; i++)
            file[i] = key[i];
    return 0;
}

当我在 Windows 上使用 cl.exe 编译它时,我得到一个大小约为 31kb 的可执行文件。每个缓冲区本身是 500kb。这有什么意义?它的一部分会分配在堆上吗?如果我用数据初始化它们,那么大小是否正确?

【问题讨论】:

  • 31 KB 对于这个程序来说似乎很多。 ;-)
  • 64KB 对任何人来说都足够了...
  • 看,妈!我可以生产无用的 cmets。
  • @Brad:那是 640KB,它可以用于任何目的除了分解大素数。
  • @goreSplatter,我的评论并不比你的没用,但如果你真的不喜欢它,我会删除它。 @Steve,感谢您的更正。

标签: c++ c windows visual-studio buffer


【解决方案1】:

在这种情况下,缓冲区将在运行时分配到程序的stack space。无需将它们静态构建到exe 文件中。

【讨论】:

  • 我认为所有堆栈分配都应该只发生在运行时(我不是在谈论常量)
  • @Elalfer,当然 - 这是因为堆栈只在运行时才存在。
【解决方案2】:

请记住,您是在声明变量(更确切地说,它们的块),而不是定义必须存储在应用程序中的数据。您在硬盘上存储的只是一系列指令,而不是缓冲区本身。

【讨论】:

    【解决方案3】:

    这些数组分配在堆栈上,就像所有自动变量一样。在二进制文件中包含一长串零只是为了表示它们的大小是没有意义的。如果您要在代码中定义数组的全部内容,那么是的,二进制大小将接近数组大小和编译代码大小的总和。

    【讨论】:

      【解决方案4】:

      在运行时在工作内存中分配、初始化和使用数组。它们不保存在 .exe 或任何文件中(保存虚拟内存或交换文件)。

      【讨论】:

      • 事实上它们是auto 变量,所以它们只是分配的,而不是初始化的。如果它们被声明为static,那将是真的。
      • 哦,对不起。我只是给出了一个超出实际 sn-p 的更一般的示例(我没有完全阅读它)。
      【解决方案5】:

      只需要非零初始化数据来构建可执行二进制文件;这些是未初始化的数组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-20
        • 1970-01-01
        相关资源
        最近更新 更多