Program Size: Code=1952 RO-data=512 RW-data=48 ZI-data=1024
复制代码
3. 接下来,我们将数组 a 的大小修改为 400 字节,然后继续进行验证。
4. 编译结果如下,且程序正常运行。
Program Size: Code=1952 RO-data=512 RW-data=44 ZI-data=1428
复制代码
此时我们可以发现Total RAM增大了。
Add Total Ram = (The current RW-data + The current ZI-data ) - (The laster RW-data + The laster ZI-data) = (1428 + 44) - (1024+ 48) = 400Byte(注意此处400Byte != (400 - 1)Byte 与字节对齐有关)
Program Size: Code=1952 RO-data=512 RW-data=44 ZI-data=2068
复制代码
程序正常运行,并没有之前的死机现象,同时我们可以发现Total RAM继续增大。
Add Total Ram = (The current RW-data + The current ZI-data ) - (The laster RW-data + The laster ZI-data) = (2068 + 44) - (1428 + 44) = 640Byte(注意此处640Byte != (1040 - 400)Byte与字节对齐有关)
2.接下来,我们来看局部常量的情况。
对于局部常量,如果使用 const 修饰与不使用 const 修饰,程序的编译结果基本没有差别。然而,由于数组 a 的大小超出了系统栈的限制,导致程序无法正常运行。值得注意的是,即使采用 const 修饰,局部变量仍然会占用系统栈空间。
3. 在使用 const 修饰局部常量后,我们期望只读数据段(RO-data)会增加,但实际上却没有增加。这种情况可能是由于优化导致的,具体是编译器优化还是 C 语言本身的优化暂时不得而知。因为我们将数组 a 的值都赋为0,这种情况被优化了。如果我们简单地修改一下,让数组 a 中的值不全为0,就能看到 RO-data 字段的增加。然而,尽管局部 const 常量会占用系统栈空间,由于系统栈大小不够,程序仍然无法正常运行。