You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 19:56:06