C++ exe是否可以小于其最大的声明缓冲区?

C++ exe是否可以小于其最大的声明缓冲区?,c++,c,windows,visual-studio,buffer,C++,C,Windows,Visual Studio,Buffer,我问的原因是: #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; } #包括 使用名称空间std; int main() { 未签名

我问的原因是:

#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;
}
#包括
使用名称空间std;
int main()
{
未签名字符文件[512000];
无符号字符键[512000];
对于(int i=0;i<512000;i++)
文件[i]=键[i];
返回0;
}

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

在这种情况下,缓冲区将在运行时分配到程序上。不需要将它们静态地内置到
exe
文件中。

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

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

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

只有非零初始化数据才需要内置到可执行二进制文件中;这些是单元化数组。

我认为所有堆栈分配都应该只在运行时发生(我不是说常数)@elafer,当然-这是因为堆栈只在运行时才存在。对于这个程序来说,31 KB似乎太多了。;-)64KB对任何人来说都足够了…看,妈!我可以产生无用的评论。@Brad:那是640KB,除了分解大素数外,它还有其他用途。@Goresplater,我的评论和你的一样没用,但如果你真的有意见,我会删除它@Steve,谢谢你的更正。事实上,它们都是
auto
变量,所以它们只是分配的,而不是初始化的。如果它们被声明为
静态的
,那是真的。哦,对不起。我只是给出了一个更一般的例子,超出了实际的片段(我没有完全阅读)。