C/C++ 中的 static

智能车竞赛轮腿穿越组:GPS+IMU导航绕桩实战技巧(附避坑指南) 本文详细介绍了智能车竞赛轮腿穿越组中GPS+IMU导航绕桩的实战技巧,包括硬件选型、传感器标定、路径规划及多传感器数据融合策略。通过实际案例和避坑指南,帮助参赛队伍提升导航精度和稳定性,避免常见错误。特别强调IMU安装位置和标定对导航系统的重要性。 阅读详情

一 、函数内部的静态变量

在函数体内定义一个局部变量时,编译器在每次函数调用时,使堆栈的指针向下移动,为这些局部变量分配内存。

定义一个全局变量将不仅仅只受这个函数控制。

在C/C++函数内部定义的 static 对象,将存储在程序的静态数据区(static data area)中。

char * c = "abc" 这样的赋值会得到一个警告:不建议从字符常量到 char * 的转换,最好在前面加上 const

  1 #include <iostream>
  2 using namespace std;
  3
  4 char oneChar(const char * charArray = 0){
  5         static const char * s;
  6         if(charArray){
  7                 s = charArray;
  8                 return *s;
  9         }else{
 10                 cout <<"un initialized\n";
 11         }
 12         if( * s == '\0'){
 13                 return 0;
 14         }
 15         return *s++;
 16 }
 17
 18 char * a = "abcdefghijklmnopqrstuvwxyz";
 19
 20 int main(){
 21         oneChar(a);
 22         char c;
 23         while((c = oneChar()) != 0)
 24                 cout << c <<endl;
 25         return 0;
 26 }

从上例可以看到 static const char * s 在每次函数调用时都保留了值。

可以看出来,在上面的函数中容易产生多线程的问题;在设计包含静态变量的函数时,应该记住多线程的问题。


二、静态对象的析构函数

静态对象的析构函数,在程序从main() 中退出时,或者标准C库的 exit()被调用时才被调用。(注意:使用abor() 来退出程序,静态对象的析构函数并不会调用)

如果一个包含局部静态对象的函数从未被调用,那么这个对象的构造函数也不会被调用。

同普通对象的销毁一样,静态对象的销毁也是按照与初始化相反的顺序进行的。

  2 #include <fstream>
  3 using namespace std;
  4
  5 ofstream out("statdest.out");
  6
  7 class Obj{
  8         char c;
  9 public:
 10         Obj(char cc):c(cc){
 11                 out<<"Obj::Obj() for "<<c<<endl;
 12         }
 13         ~Obj(){
 14                 out<<"Obj::~Obj() for "<<c<<endl;
 15         }
 16 };
 17
 18 Obj a('a');
 19
 20 void f(){
 21         static Obj b('b');
 22 }
 23
 24 void g(){
 25         static Obj c('c');
 26 }
 27
 28 int main(){
 29         out <<"inside main()"<<endl;
 30         f();
 31         out <<"leaving main()"<<endl;
 32
 33         return 0;
 34 }

注意跟踪文件ofstream 的对象out 也是一个静态对象。

在C++ 中,全局静态对象的构造函数是在main()之前调用的,这样就有了一个在进入main() 之前执行一段代码的方法。

三、变量可见性

所有的全局对象都是隐含为静态存储的。

       int a = 100;

        则 a 被存储在程序的静态数据区,在进入main() 之前,a 已经初始化了。另外,a 对所有的编译单元都是全局可见的。用可见性术语来说,static(只在翻译单元内可见),extern 则明确声明对所有翻译单元都可见。

所以上面的定义和 extern int a = 0 是一样的

但如果这样定义:

static int a = 0  只是改变了a 的可见性,只在本翻译单元内,有时叫文件静态(file static),但并没有改变存储类型—— 仍然驻留在静态数据区,而不管是static 还是 extern

在局部变量中,就总是内部链接了,extern 的修饰没有意义;使用 static 时只会改变变量的存储类型。


四、定义静态数据成员的存储

        因为类的静态数据成员有着单一的存储空间,所有必须在一个单独的地方定义,编译器不会分配存储空间,如果一个静态数据成员被声明但没有定义,则连接器会报告错误。

定义必须出现在类的外部(不允许内联),而且只能定义一次。

(1)这些变量唯一合法的初始化地方就是在定义时

(2)这些变量只能够被定义一次

以上两点来保证变量只被创建者所控制。

 

静态成员函数:

为类的全体对象服务。 可以用普通的方法调用静态成员函数,用“ .” 或者“->” 把它和一个对象相联系。一个更典型的方法是自我调用。

静态成员函数不能访问一般的数据成员,而只能访问静态的数据成员。原因在于:对象的地址(this)是被隐式传递到调用函数的;但static 函数没有this,因此无法访问一般成员。静态函数在速度上比全局函数有少许增长,不仅没有传递this所需要的额外开销,而且还有使得函数在类内的好处。

 

Static initialization dependency:

对于作用域为多个翻译单元的静态对象来说,不能保证初始化顺序,这可能会导致一些问题。

YOLOv5添加注意力机制的具体步骤 本文主要介绍了 本文在此篇博客的基础上向YOLOv5-5.0版 本文主要包括以下内容一、CBAM注意力机制添加(1)修改yolov5s主干网络(2)在common.py中添加可调用的CBAM模块(3)向yolo.py文件添加CBAMC3判断语句二、SE注意力机制添加 本文以yolov5s网络为例 一、CBAM注意力机制添加 注意力机制可以添加在backbone,Neck,Head等部分,接下来本文以backbone主干网络为例 (1)修改yolov5s主干网络 1.在yolov5-5.0工程文件夹下,找到m 阅读详情

相关推荐

Python 爬虫实战:爬取 GitHub 热门项目(星数 / 语言 / 作者)

本文系统介绍了使用Python爬虫技术获取GitHub热门项目数据的完整方案。通过分析GitHub Trending页面和官方API两种数据源,详细讲解了HTML解析、JSON数据处理、反爬应对策略等关键技术。采用requests、BeautifulSoup、pandas等工具链,实现了项目信息(名称、星数、语言等)的结构化爬取,并配套数据清洗、统计分析及可视化功能。特别强调遵守GitHub API使用规范,包括Token认证、请求频率控制等合规要求。该方案为开发者提供了一种高效、合法的数据采集方法,适用于

2503_91057718的博客 2304

C语言中Static的一个功能特性

特点: static局部变量的”记忆性”与生存期的”全局性” 所谓”记忆性”是指在两次函数调用时,在第二次调用进入时,能保持第一次调用退出时的值。static的统计次数功能 声明函数的一个局部变量,作为一个计数器,这样函数每次被调用的时候就可以进行计数。这是统计函数被调用次数的最好的办法,因为这个变量是和函数息息相关的,而函数可能在多个不同的地方被调用,所以从调用者...

Heart_2016的博客 631

基于3D相机的人体穴位识别与标注系统——完整Python实现方案

摘要 本文提出了一种基于3D相机的人体穴位识别与标注系统完整实现方案。系统采用Intel RealSense D435相机实时采集RGB-D数据,结合MediaPipe Pose模型进行人体33个关键骨骼点的三维姿态估计。通过建立穴位与骨骼关键点的映射关系,利用相机内参和深度信息将二维图像坐标转换为三维空间坐标。系统采用模块化设计,包含数据采集层、算法处理层、坐标转换层和可视化层,实现了穴位定位、三维坐标转换和点云可视化功能。关键技术包括:基于骨度折量法的穴位映射算法、深度图像到三维点云的转换方法,以及Op

AI的内部世界的博客 236

static 关键字的用法

1.用在函数内,在多次调用间,保持值不变void func() {     static int i = 0;     cout

RichardYSteven的专栏 1399

静态函数之多线程

静态成员变量可以再非静态成员函数中使用,Bjarne Stroustrup为什么再创建C++的时候要创建一种静态成员函数呢? C++产生年份: 1982年,美国AT&amp;T公司贝尔实验室的Bjarne Stroustrup博士在c语言的基础上引入并扩充了面向对象的概念,发明了—种新的程序语言。为了表达该语言与c语言的渊源关系,它被命名为C++。而Bjarne Stroustrup(本贾尼·...

宁静致远的博客 2349

C++ Static变量跨平台、多线程安全性分析

单例模式编程语言的多线程安全。单例模式开始讨论常见的编程语言,不论强类型弱类型,还是Just In Time(JIT)或Ahead of Time(AOT)的语言,都会涉及到设计模式,其中...

淘系技术 3780

static在C/C++中的作用详解

本文详细介绍了static在C/C++中的作用以及使用方法,本文分两部分: 第一部分介绍extern在c语言中的作用; 第二部分介绍extern在c++中的作用; Source.cpp文件内代码 /*Source.cpp file*/ #include "Header.h" static int a = 1; int b = 1; //声明,也是定义 static int add1(int a...

qq_35118533的博客 586

详解C/C++中的static和extern

详解C/C++中的static和extern 从一个小例子开始 开发过程中希望在多个cpp文件中都使用某个全局变量,那这个全局变量该怎么定义、怎么使用呢? 这部分会先给一个小例子,展示编译和运行效果,并不会深入解释背后的原因,关于底层原理的解释会放到后续的部分! 头文件中定义全局变量 异想天开的认为,在头文件中定义全局变量,然后在各个cpp文件include该头文件,这样不就每个cpp中都能访问该全局变量了吗? Head.hpp #ifndef HEAD_H #define HEAD_H

yantuguiguziPGJ的博客 2812

C/C++中的static与extern

变量默认是内部链接,函数默认是外部链接。 因此用来外部链接的函数,声明时有无extern都可以连接通过。而全局变量则不行。 外部链接(ExternalLinkage)--extern 如果最终的可执行文件由多个程序文件链接而成,一个标识符在任意程序文件中即使声明多次也都代表同一个变量或函数,则这个标识符具有External Linkage。具有External Linkage的标识符编译...

weixin_41884844的博客 817

关于extern和static在C/C++中的作用

extern讲解: 1、extern的作用:   (1)、extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中            寻找其定义。   (2)、extern也可用来进行链接指定。 2、extern变量: 文件a.cpp int i = 1 ; //定义了全局变量,在整个文件中都可见 void ca

Chris_Home 742

C/C++中的static

static 〇、内存区域和初始化时机 已经初始化的static成员存在于.data段,未初始化的在.bss段,都初始化为0。 C和C++中静态局部变量的初始化方法不同。 C中,初始化发生在代码执行之前,编译阶段分配好内存之后,就会进行初始化,所以在C语言中无法使用变量对静态局部变量进行初始化。 C++中,初始化时在执行相关代码时才会进行初始化,主要是由于C++引入对象后,要进行初始化必须执行相应构造函数

weixin_39861267的博客 978

C/C++中的断言(assert与static_assert)

你也可以通过我的独立博客 —— www.huliujia.com 获取本篇文章 assert简介 assert被C/C++用来判断某些条件是否成立,比如判断指针类型的大小sizeof(void*)是否大于8,或者判断malloc返回的指针是否为null。 assert的函数申明如下: void assert( int expression ); 如果expression为0,即false,assert就会把函数名,源代码文件名、当前行号发送给标准错误stderr,然后调用abort()终止执行。 什么.

胡LiuJia@BLOG 4202

C/C++ 中的static

快速了解static static的作用有三条: 一、第一个作用:隐藏。加了static,就会对其它源文件隐藏. 二、static的第二个作用是保持变量内容的持久.延长局部变量的生命周期 三、static的第三个作用是变量默认初始化为0。 使用static的格式:     static 变量类型 变量名  static 函数类型 函数名(函数参数表) 回答static的问题应该从C语...

lengxinxuexic的博客 214

static关键字在c/c++中的作用

c/c++static的作用

Byersen的博客 2887

static 在C/C++中的用法总结

static关键字是C, C++语言中中都存在的关键字, 它主要有三种使用方式, 其中前两种只指在C语言中使用, 第三种在C++中使用. (1)局部静态变量 (2)外部静态变量/函数 (3)静态数据成员/成员函数 下面就这三种使用方式及注意事项分别说明 一、局部静态变量 在C/C++中, 局部变量按照存储形式可分为三种auto, static, register (谭浩强, 第1

Something of an idiot 819

c++之多线程环境下static的坑

#include #include #include int count=0; //测试多次可以看出,每次输出结果不相同,会获取到不正常的重复数据。 //多线程环境在getStringFromFd方法中的static区域 会获取到上修改过的数据,故函数内部的static char line[512];在多线程环境下是不安全的。 char* getStringFromFd(int tid)

云守护的专栏 9555

static 用法小结

static关键字是C,   C++中都存在的关键字,   它主要有三种使用方式,   其中前两种只指在C语言中使用,   第三种在C++中使用(C,C++中具体细微操作不尽相同,   本文以C++为准).     (1)局部静态变量     (2)外部静态变量/函数     (3)静态数据成员/成员函数     下面就这三种使用方式及注意事项分别说明         一、局部静态变量     在

Buddy 's Workstation 652

条款21:static对象引起的多线程安全性

看到条款21:必须返回对象时,别妄想返回其reference时,看到一句话“就像所有用上static对象的设计一样,这一个也立刻造成我们对多线程安全性的疑虑。”虽然多线程有一点了解,但多线程安全性居然还没听过(囧)。 #include #include long global1 = 0; volatile long global2 = 0; class MyClass { public:

onlyou2030的博客 867

static在C和C++中各代表什么含义?

转自:http://blog.sina.com.cn/s/blog_60d6fadc010140g4.html static关键字有三种使用方式,其中前两种只指在C语言中使用,第三种在C++中使用。 1. 局部静态变量(C) 2. 外部静态变量/函数(C) 3. 静态数据成员/成员函数(C++) 一、 局部静态变量 局部变量按照存储形式可以分为三种,分别是auto、static、reg

lungfei 3594

qt,c++为什么要进行序列化和反序列化。已经 1 字节对齐 `#pragma pack(1)`,为什么还要 QDataStream?

qt,c++为什么要进行序列化和反序列化。已经 1 字节对齐 `#pragma pack(1)`,为什么还要 QDataStream?

sunflower_2020的博客 62

IPC_4101C刚性与多层印制板用基材规范.doc

IPC_4101C刚性与多层印制板用基材规范.doc

cudnn64_8.dll、cudnn_ops_infer64_8.dll等tensorflow所需dll

cudnn64_8.dll、cudnn_ops_infer64_8.dll等tensorflow所需dll

上一篇: gtest在cocos2dx 3.0 中的字体
下一篇: Thinkcpp 学习笔记 友元
向恺然
博客等级 码龄12年 0粉丝 7原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值