C++ static 关键字详解
Cstatic关键字static在 C/C 中随语境改变链接、存储期或类成员归属。下文按变量局部/命名空间作用域、自由函数、类成员分别说明并涉及 C11/C17 中与初始化、inline相关的规则。目录链接、存储期与作用域静态局部变量命名空间作用域变量的内部链接内部链接的自由函数类静态数据成员与静态成员函数C 与 C 在文件作用域static上静态局部初始化与 C17inline变量静态存储期与常见内存布局析构顺序与并发归纳链接、存储期与作用域链接内部 / 外部存储期自动 / 静态 / 动态作用域块 / 文件 / 类语境下static的典型效果局部变量存储期变为静态初始化次数为一次首次执行到声明时命名空间作用域变量/函数内部链接不与其他翻译单元合并符号类成员成员逻辑上属于类由该类所有对象共享存储数据成员或表现为无this的成员函数静态局部变量作用域所在块内。生命周期程序运行期间首次执行到声明时初始化之后保留末次写入的值。零初始化未显式初始化时先零初始化再按类型规则进行后续初始化若适用。voidfunc(){staticintcount0;count;std::coutcount: count\n;}常见用途包括调用计数、函数内缓存以及通过函数内静态局部对象实现延迟初始化单例。命名空间作用域变量的内部链接命名空间作用域含全局的static变量为内部链接仅当前翻译单元可见不能与其它.cpp中的extern声明绑定到同一实体。// file1.cppstaticintmoduleVar10;// file2.cpp// extern int moduleVar; // 与 file1 中符号无关匿名命名空间中的名字同样为内部链接与文件作用域static在「限制符号导出」上效果相近项目内可择一约定。内部链接的自由函数命名空间作用域的static函数为内部链接等价于仅在本翻译单元提供的辅助函数避免跨.cpp符号重名。staticvoidhelper(){/* ... */}类静态数据成员与静态成员函数静态数据成员存储上由全类共享不随每个对象各存一份。类体内一般为声明非inline时需在某一翻译单元内唯一定义constexpr/const整型等情形除外。C17 起可使用inline static在类内完成定义。structWidget{staticintcount;};intWidget::count0;structWidget{inlinestaticintcount0;};静态成员函数无隐式this不能直接读写非静态成员可访问静态成员及调用其它静态成员函数。调用语法为类名::或经对象与类名::语义一致。C 与 C 在文件作用域static上CC文件作用域static变量/函数内部链接内部链接语义延续类无增加静态数据成员、静态成员函数静态局部初始化与 C17inline变量C11函数内静态局部对象的首次初始化由实现保证线程安全多线程首次同时进入该函数时初始化只发生一次。典型写法SingletongetInstance(){staticSingleton instance;returninstance;}标准不保证初始化完成之后对该对象的并发写安全多线程写入共享可变静态数据仍需同步原语。C17inline变量可在头文件中定义inline int x 0;全程序单一实体。文件作用域static int x 0;则为每翻译单元各一份内部链接对象。二者语义不同不可互换使用。写法链接与实体static int x 0;文件作用域内部链接每.cpp一份inline int x 0;可置于头文件弱符号合并程序级唯一定义静态存储期与常见内存布局存储期代表生存期与常见存放位置实现相关静态static局部/全局含类静态数据成员程序启动至结束常位于.bss/.data等自动普通局部变量、形参进入块至离开块通常为栈局部变量使用static的效果之一是将存储期从自动改为静态。析构顺序与并发话题说明静态非局部对象析构跨翻译单元析构顺序未指定对象间存在析构依赖时可能产生悬空访问静态局部对象析构在程序退出阶段进行顺序与构造相反同一线程/同一块内并发写入仅首次初始化受标准线程安全约束之后对可变静态的写需自行同步类静态成员定义C17 前非inline成员须在某一.cpp提供定义否则链接错误const static整型成员历史上存在类内初值与类外定义的特例当前常用inline static constexpr在类内一次写清归纳文件作用域static表示内部链接匿名命名空间为等价手段之一。块作用域static改变存储期与初始化次数。类static成员共享存储或表现为无实例依赖的函数。C11函数内静态局部的首次初始化线程安全。C17inline变量与inline static成员简化头文件与单一定义。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2444081.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!