我正在生成静态版本和非静态版本的汇编代码,唯一的区别在于静态版本中不存在该变量。我认为它已被删除,因为在我的测试中没有使用它。
你是否在你的测试中使用了这个变量?也许优化器已经在静态版本中删除了这个变量。
我正在使用gcc。要构建汇编代码,请传递-S参数:
gcc -S main.c
这是用于非静态版本的测试代码:
#define SOME_LARGE_NUMBER (100000000000000000)
int arr[SOME_LARGE_NUMBER];
int main(const int argc, const char* argv[]) {
return 0;
}
这是关于静态版本的内容:
#define SOME_LARGE_NUMBER (100000000000000000)
static int arr[SOME_LARGE_NUMBER];
int main(const int argc, const char* argv[]) {
return 0;
}
这是我得到的差异:
$ diff main.static.s main.nostatic.s
23a24
> .comm _arr,400000000000000000,4 ## @arr
根据您提供的信息,我能了解到以下内容。请问您能否提供更多关于您的代码的细节?
编辑:在附加的图像中,我们可以看到Windows应用程序的内存布局。当我们在函数中使用static修饰符时,它被存储在.data段中,而不是程序堆栈中,因此您不会遇到堆栈溢出问题。在编译时,数组的大小已知,因此二进制映像为数据存储足够的空间。两个版本中,你的EXE文件大小是多少?如果我没有错的话,静态版本的EXE文件大小将比非静态版本大得多。我假设数组的大小在加载二进制文件时被保留到数据段中。但是,在使用非静态版本时,它取决于设置堆栈的内存量。您可以使用命令行编译时的标志"/F"来修改此大小(请参阅此链接
https://msdn.microsoft.com/en-us/library/tdkhxaks.aspx)。我没有安装Windows虚拟机进行双重检查。
总的来说,静态变量不会存储在堆栈中,因此使用静态版本时不会导致堆栈溢出。