我正在尝试计算程序中使用的堆栈内存。
- 我是否应该为我定义的每个整数添加4个?
- 诸如char str [128],shoudld之类的东西我添加128或129?
-
#define ARRAY1_LIMIT 200 #define ARRAY2_LIMIT 100 char* array1[ARRAY1_LIMIT]; char* array2[ARRAY2_LIMIT]; int i = 0; int j = 0 array1[i] = (char *)malloc(sizeof(char)*5); array2[j] = (char *)malloc(sizeof(char)*10);
我知道堆内存是5 15 = 15,但是我不知道如何计算堆栈内存?是200 100吗?
如果您正在做其他事情,而不仅仅是尝试了解堆栈用法以及可变分配的影响如何,您还需要使用堆栈深度分析工具。这样的工具可以帮助您确定您的程序是否可以在任何可能的事件序列(除了意外或无限的递归)下溢出堆栈。您可以编写自己的(在C#中,对于使用GCC和IAR编译器编辑的C中的C#,用于C#的嵌入式程序),但这确实很复杂,而不是初学者尝试的东西。
>为您的特定处理器和工具链寻找"堆栈用法分析仪"或"堆栈使用分析工具"(例如x86/x64/x64/amm/etc,以及gcc/visualstudio/iar/etc)。
>如果您使用的是GCC,则可以使用-fstack-usage
选项,但这只能在每个功能的基础上为您提供最大堆栈使用情况。从本身就没有极大帮助的情况下,要验证程序不会吹出堆栈,您必须递归地走Calltree,以查看最大堆栈深度在呼叫树的任何级别上可能是什么。如果您还使用-Wstack-usage
选项,则可以在任何子程序的堆栈使用情况下可能会超过指定的堆栈深度,这比仅使用-fstack-usage
选项获得的信息更有用。
如果您试图找出函数中分配给这些变量的空间的数量,请使用sizeof()
操作员。请注意,数组是char *
的数组,它们是字符而不是字符的指针。
#include <stdio.h>
int main(void) {
size_t total=0;
size_t first_array_size=sizeof(char *[200]);
printf("first array: %zun",first_array_size);
total+=first_array_size;
size_t second_array_size=sizeof(char *[100]);
printf("second array: %zun",second_array_size);
total+=second_array_size;
size_t int_size=sizeof(int);
printf("int size: %zu * 2 = %zun",int_size,int_size*2);
total+=int_size*2;
printf("total=%zun",total);
return 0;
}
典型输出(在64位体系结构上):
first array: 1600
second array: 800
int size: 4 * 2 = 8
total=2408
结果可能会有所不同。
脚注:还值得了解分配给堆栈框架的空间可能更大。例如,传递的参数通常被复制到堆栈中,返回值以及指示器的指针表示返回函数后返回的执行点。还有一致的复杂性。例如,在许多现代机器上,变量之间可能会留出空间,以确保它们对齐。但是,优化可能会取决于其重新订购变量的方式。还可能将值(尤其是整数值)分配给寄存器,而不占用堆栈上的空间。
最后,实现原则上可以分配堆上的数组。对于可变长度阵列来说,这当然是可能的实现,但我不知道它严格不允许固定尺寸数组。