它们是有区别的。静态变量在动态内存空间中初始化,因此占用了额外的内存空间,更不用说您需要可执行代码(额外的内存)来初始化和访问它们。
所有 const 数据都位于与只读存储器 (ROM) 的可执行代码相同的内存空间中,其中静态数据被加载到动态内存中,您可以在其中潜在地对其进行读写。现在这是以前的答案中似乎被忽略的有趣部分。静态数据占用动态内存空间,但需要额外的 ROM 空间,在最坏的情况下,可能会占用两倍的内存量。考虑以下:
class StaticData
{
static string s_static1 = "My string data";
}
class ConstData
{
const string CONST1 = "My string data";
}
StaticData 类有变量 s_static1,它将占用单个指针(通常为 1 个整数)的动态内存空间。然而,它也必须被初始化,因此也必须存在 ROM 代码来初始化它。字符串数据本身通常位于 ROM 空间中,因为字符串数据是不可变的,并且不会占用比常量示例更多的空间。
对于 ConstData 类,只需要 ROM 存储空间,因此在大多数情况下,这是对内存的最佳使用。
现在,当您考虑编译器如何使用数据时,它变得更加有趣。除字符串/字符数据外,常量通常在引用点的代码中直接替换。换句话说,常量值直接加载到寄存器或压入堆栈,具体取决于使用情况。在静态变量的情况下,编译器必须通过附加代码(指针引用)从内存中读取该值,因此需要附加 ROM 代码。
总之,静态代码将通过占用额外的动态内存空间和取消引用它所需的额外可执行代码空间来占用更多内存。