有趣的static

博客主要介绍了类的静态属性和静态方法。静态属性无法通过实例属性访问,需用“类名.静态属性”访问,且可改写,子类继承超类构造函数时编译器会自动处理。静态方法中不能访问实例变量,如示例中在静态函数里访问实例变量会出错。

静态属性

var ddd1 = new Widget();

trace(ddd1.widgetCount);

//out.print:undefined

//**无法通过实例属性访问widgetCount

trace(Widget.widgetCount);

//out.print:1

//**通过 “类名.静态属性”访问

var ddd2 = new Widget();

trace(Widget.widgetCount);

//out.print:2

var ddd3 = new Widget();

trace(Widget.widgetCount);

//out.print:3

var ddd4 = new Widget();

trace(Widget.widgetCount);

//out.print:4

Widget.widgetCount = 110;

trace(Widget.widgetCount);

//out.print:110

//**静态属性仍然可以改写

ddd5 = new SubWidget();

//out.print:Creating subwidget # 111

trace(Widget.widgetCount);

//out.print:111

//***说明创建一个子类继承了超类的构造函数

/**

可以理解“如果您没有将对 super() 的调用放入子类的构造函数中,

则编译器将自动生成对其不含参数的直接超类的构造函数的调用作为该函数的第一个语句。”

*/

var ddd6 = new Widget();

trace(Widget.widgetCount);

//out.print:111

var ddd7 = new Widget();

trace(Widget.widgetCount);

//out.print:112

静态方法

class StaticTest {

       var name = "Ted";

       static function getName() {

              var local_name = name;

              // 错误!不能在静态函数中访问实例变量。

       }

}

//通过上面的就可以理解“类(静态)方法只能访问类(静态)属性,而不能访问实例属性
<think>嗯……用户这次询问的是静态资源使用相关的信息。从引用内容来看,用户似乎正在研究设备驱动开发或系统级编程中的资源管理问题。引用[2]中提到的__devm_request_region函数很有趣,这是Linux内核中典型的资源管理实现——通过devres框架自动管理资源生命周期。 用户可能正在开发Linux设备驱动程序,遇到了资源泄漏问题,或者想深入理解内核的资源管理机制。考虑到之前的对话历史涉及快速排序,这次突然转向系统编程,用户或许是位全栈开发者?不过更可能是新任务的需求。 关于静态资源使用,需要从多个维度解释: 首先是编译期静态分配的内存,比如全局变量和静态变量。这些数据在程序整个生命周期都占据固定内存空间。通过size命令查看可执行文件时,text/data/bss段的大小就很说明问题。 然后是只读数据段,比如字符串常量。有趣的是,编译器会把相同的字符串常量合并存储,这个优化很重要但常被忽视。在多线程环境下,这类数据的访问需要特别小心,虽然它们不可修改,但读取也可能引发缓存一致性问题。 内核开发方面,用户引用的devm_系列函数正是处理设备静态资源的关键。这些资源在设备初始化时分配,在设备卸载时自动释放。背后的devres机制就像微型垃圾回收器,特别适合驱动开发——毕竟驱动开发者最怕的就是忘记释放资源导致内核崩溃。 优化建议部分,考虑到用户能研究到这么底层的代码,应该是有真实性能需求的。所以特别强调const正确性和避免全局变量,这两点在嵌入式系统里尤其重要。补充一个冷知识:Linux内核通过__init宏标记初始化代码,使得这些代码在系统启动后可以被自动释放,这个技巧值得推荐给用户。 相关问题设计成阶梯状:从基础的内存布局,到中级的工具使用,再到高级的内核机制。特别是第三个关于静态变量生存期的问题,很多C语言开发者都会在这里踩坑。最后放个hook问是否需要具体示例,这样下次用户追问时就能直接切入代码级实现。 </think>静态资源使用(Static Resource Usage)指程序在编译期或加载期分配且在运行期间持续存在的资源(如内存、文件句柄、设备寄存器等),其生命周期通常与程序/模块的运行周期一致。以下是关键信息和分析: --- ### **核心概念** 1. **静态分配内存** - **全局/静态变量**:在数据段(`.data`或`.bss`)分配,程序启动时初始化,退出时释放。 ```c static int global_var; // 未初始化 → .bss段(清零) const char* str = "Hello"; // 初始化 → .data段 ``` - **常量数据**:如字符串字面量存储在只读段(`.rodata`),不可修改。 2. **静态资源管理机制(以Linux内核为例)** - **自动释放**:通过 `devm_*` API(如 `devm_request_region` [^2])申请的资源,会在设备卸载时由内核自动回调释放函数,避免泄漏。 - **示例流程: ```c dr = devres_alloc(devm_region_release, ...); // 1. 分配释放回调 res = __request_region(...); // 2. 申请资源 devres_add(dev, dr); // 3. 绑定资源到设备 ``` 设备卸载时 → 触发 `devm_region_release` → 释放资源。 3. **特点** - **持久性**:不依赖运行时动态分配(如 `malloc`)。 - **作用域限制**:静态变量仅在定义域内可见(文件级或函数级)。 - **线程安全风险**:全局静态变量需考虑同步(如加锁)。 --- ### **优化建议** 1. **避免过度使用全局静态变量** - 改用局部静态变量(函数内)或封装为模块内部状态。 2. **优先使用 `const`** ```c static const int MAX_SIZE = 100; // 编译器可优化,且防止篡改 ``` 3. **资源绑定生命周期** - 参考Linux `devm_*` 模式,将资源与对象(如设备)绑定,自动化管理[^2]。 --- ### **监控工具** | 工具 | 用途 | |---------------|-------------------------------| | `size` | 查看可执行文件各段大小(text/data/bss) | | `valgrind` | 检测内存泄漏(静态变量本身不适用,但关联资源适用) | | `/proc/<pid>/maps` | 查看进程内存映射(含静态段) | --- ### **相关问题** 1. 静态变量与全局变量在内存布局中有何区别? 2. 如何检测程序中未释放的静态资源(如文件句柄)? 3. 在多线程环境下使用静态变量有哪些风险?如何规避? 4. Linux内核的 `devres` 机制如何实现资源自动释放?[^2] > 需要代码示例或具体场景分析可进一步说明。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值