block-底层数据结构

1.block的本质

1.block的本质也是一个OC对象,它也有一个isa指针
2.block是封装了函数调用以及函数调用环境的OC对象
3.block底层结构图,如下
block底层结构

2.block底层代码探索

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        void (^block)(void) = ^ {
            NSLog(@"Hello World!");
        };
        block();
    }
    return 0;
}

以上是我们经常看到的OC代码,我们可以通过clang指令,将OC代码转成C/C++代码,但这并不是最终的源码,只是中间代码,让我们更加的容易理解block底层做了些什么东西,为什么能回调等等。转换过程:cd到程序main.m的目录下,执行命令xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m,即可发现目录下多了main.cpp文件,将其拖到工程里查看其源码。筛选重要的部分代码,如下

struct __block_impl {
    void *isa;
    int Flags;
    int Reserved;
    void *FuncPtr;
};

struct __main_block_impl_0 {
  struct __block_impl impl;
  struct __main_block_desc_0
Oracle数据库的底层数据结构设计复杂且高度优化,以支持大规模数据存储和高效的数据访问。从逻辑和物理两个层面来看,Oracle数据库的数据结构主要包括以下几个关键部分: 1. **数据块(Data Block)** 数据块是Oracle数据库中最小的存储单位,通常大小为4KB、8KB或16KB,具体大小取决于操作系统的配置。数据块包含多个部分,如块头(Block Header)、行数据(Row Data)和空闲空间(Free Space)等,这些部分用于管理块内的数据存储和维护信息[^5]。 2. **段(Segment)** 段是数据库对象(如表或索引)在物理存储上的映射。每个段由一个或多个区(Extent)组成,而每个区又由多个数据块组成。段的类型包括表段、索引段、回滚段等,它们分别用于存储不同类型的数据对象[^3]。 3. **区(Extent)** 区是由一组连续的数据块组成的存储单元,用于为特定的段分配存储空间。当段需要更多的存储空间时,数据库会为其分配新的区[^4]。 4. **表空间(Tablespace)** 表空间是数据库中逻辑存储的最高层次,它由一个或多个数据文件组成。每个表空间可以包含多个段,而段则进一步划分为区和数据块。表空间的设计使得数据库能够灵活地管理物理存储,而不影响逻辑存储结构的访问[^4]。 5. **内存结构(Memory Structures)** Oracle数据库的内存结构主要包括系统全局区域(SGA)和程序全局区域(PGA)。SGA是一个共享内存区域,包含了数据库缓冲区缓存、重做日志缓冲区、共享池等组件,用于提高数据库性能。PGA则是每个服务器进程私有的内存区域,用于存储会话变量和排序操作等临时数据[^4]。 6. **进程结构(Process Structures)** Oracle数据库的进程结构包括服务器进程、后台进程和从属进程。服务器进程负责处理客户端请求,后台进程负责执行数据库操作(如写入数据、日志记录等),而从属进程则辅助后台进程完成特定任务[^3]。 7. **逻辑结构(Logical Structures)** 逻辑结构包括表、索引、视图等数据库对象,它们是用户可以直接操作的对象。逻辑结构与物理结构分离,使得数据库能够在不影响用户操作的前提下优化物理存储。 这些数据结构共同构成了Oracle数据库的底层存储体系,确保了数据库的高效运行和数据的可靠存储。 ```python # 示例代码:展示如何查询Oracle数据库中的表空间信息 import cx_Oracle # 连接到Oracle数据库 connection = cx_Oracle.connect('username', 'password', 'localhost/XE') cursor = connection.cursor() # 查询表空间信息 cursor.execute(""" SELECT tablespace_name, file_name, bytes/1024/1024 AS size_mb FROM dba_data_files """) # 打印结果 for row in cursor.fetchall(): print(row) # 关闭连接 cursor.close() connection.close() ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值