前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >static和struct

static和struct

作者头像
无敌清风蓝
发布2024-06-04 19:51:35
480
发布2024-06-04 19:51:35
举报
文章被收录于专栏:无敌清风蓝无敌清风蓝

1.起因

同事上班问了我一个问题,说在项目代码里看到了static struct的用法,但是编译器报错了,问我知道不知道,我脑子一呆,貌似没见过这种用法啊兄弟,只见过static一个变量或者函数的,static struct是什么操作呢

并且同事又说在网上查到,struct是不占空间的,static是占空间的,所以不能static struct,我寻思struct记忆中不是只占最大变量的那个空间嘛,所以觉得这问题值得一思考,便有了这篇文章

2.static struct可以用吗

首先回答这个问题

代码语言:javascript
复制
static struct MyStruct {
    int myInt;
};

这是错误的,因为static只能声明变量和函数,不能声明类型,如果想声明一个静态的MyStruct实例,需要这样做

1.定义MyStruct

2.声明一个静态的实例

也就是下面这个代码

代码语言:javascript
复制
struct MyStruct {
    int myInt;
};

// 在函数外部声明一个静态的MyStruct实例
static MyStruct myInstance;

在C++中,我们可以声明一个静态的结构体实例。这意味着该结构体实例在整个程序的生命周期内都是存在的,并且在其所在的作用域内是唯一的。

在这个例子中,myInstance是一个静态的MyStruct实例。无论函数被调用多少次,myInstance始终指向同一个内存地址,其值在程序的生命周期内保持不变。

但是可不能这样写奥

代码语言:javascript
复制
struct MyStruct {
    static MyStruct myInstance;  // 这是错误的
};

这样也就是在结构体定义中声明静态结构体,这样是不行的,因为静态成员并不是结构体的实例成员,而是属于结构体类型本身的。因此,我们不能在结构体定义中声明另一个相同类型的静态结构体

3.struct占空间吗

这个话题比较有意思

首先我们得先明白,结构体的声明和实例化

1.声明

代码语言:javascript
复制
struct MyStruct {
    int myInt;
    double myDouble;
};

2.实例化

代码语言:javascript
复制
struct MyStruct {
    int myInt;
};

// 创建一个MyStruct实例
MyStruct myInstance;

在C++中,结构体的声明并不会占用内存空间。结构体的声明只是为了以后声明结构体变量的模板。换句话说,声明只是告诉编译器在某个地方有一个具有如上类型和大小参数的结构体,但是并没有为该结构体在内存中预留空间。

然而,当你创建一个结构体的实例时,就会为该实例分配内存空间。每个实例都会有自己的一份内存空间,用于存储其成员变量的值。例如上面写的实例化,myInstance是一个MyStruct的实例,它在内存中占用了一定的空间,用于存储myInt的值。

4.总结

C++的知识真滴多,不过学到后,把以前模糊的地方搞清楚也是蛮开心的!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023/10/17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.起因
  • 2.static struct可以用吗
  • 3.struct占空间吗
  • 4.总结
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档