Swift中类(class)的地址存储在何处?类地址是否存于栈中?
关于结构体/类的栈/堆存储误区
首先纠正一个核心误解:变量存储在栈还是堆,和它是结构体(struct)还是类(class)没有直接关系,完全由分配方式决定。
栈存储的场景:
当你在函数作用域内直接声明变量(不管是struct还是class),或者作为函数参数传递时,这个变量的完整实例会被分配在栈上。比如:struct MyStruct {}; class MyClass {}; void test() { MyStruct s; // 整个s实例在栈上 MyClass c; // 整个c实例在栈上 }栈内存会在函数执行结束后自动释放,不需要手动管理。
堆存储的场景:
当你用new(C++)、malloc等动态分配方式创建实例时,不管是struct还是class,实例本身会被分配在堆上。而如果用来指向这个堆实例的指针是在函数内声明的,那么这个指针变量(存储着堆实例的地址)会在栈上。比如:void test() { MyClass* c_ptr = new MyClass(); // c_ptr是指针变量,存在栈上;它指向的MyClass实例存在堆上 MyStruct* s_ptr = new MyStruct(); // 同理,s_ptr在栈,struct实例在堆 delete c_ptr; delete s_ptr; // 堆内存需要手动释放 }
回到你的问题:“类的地址也存储在栈中”这种说法不够准确。正确的表述是:如果类实例是动态分配在堆上的,那么指向该实例的指针(存储着实例的地址)可能存储在栈中;但如果是直接声明的类实例(不用new),整个实例都在栈上,不存在“地址单独存在栈”的情况——它的地址本身就是栈内存的地址。
另外补充:结构体也完全可以被分配在堆上,类也可以完全在栈上,二者在存储规则上没有本质区别(C++中struct和class的核心差异仅在于默认访问权限,存储逻辑一致)。
内容的提问来源于stack exchange,提问作者iNeonFox
相关产品推荐
相关产品推荐

