VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1478|回复: 10

union和bit-field两问!!!!!!

[复制链接]

2

主题

54

帖子

34.00

积分

新手上路

Rank: 1

积分
34.00
发表于 2020-3-8 22:30:01 | 显示全部楼层 |阅读模式
1。union中的成员不能是static,引用,定义了构造函数,析构,operator=的类类型的对象
2。bit-field不能是类的静态成员

等待高手指教。
回复

使用道具 举报

2

主题

54

帖子

34.00

积分

新手上路

Rank: 1

积分
34.00
 楼主| 发表于 2020-5-31 19:00:01 | 显示全部楼层
我个人的感觉
可能和引用,提供显式构造的类对象都需要初始化有关系,从这点上看的话,静态成员也是如此,它的初始化是系统给代劳了,感觉上这样的,但是即使这也不太清楚具体的内部机制,各位高手指教
回复

使用道具 举报

2

主题

54

帖子

34.00

积分

新手上路

Rank: 1

积分
34.00
 楼主| 发表于 2020-6-1 09:15:01 | 显示全部楼层
位域那个我这么理解的,由于对于位域而言,类型对编译器
仍是普通类型,只是存放内存空间比较特殊可以指定,这个工作交给用户去做,静态变量的初始化按原来的进行,一个int仍分配32字节,规定这样的话,编译器对于静态对象的处理不必特殊化判断
回复

使用道具 举报

0

主题

37

帖子

28.00

积分

新手上路

Rank: 1

积分
28.00
发表于 2020-6-2 23:00:02 | 显示全部楼层
揣测一下
一旦某个东西被声明为static就说明这个东西是独立的了,比如class的static数据成员是不放在对象中的。对于共享空间的union来说,static关键字完全没有意义,既然你自己在外面有地方呆,还来这共享个啥子呢?
回复

使用道具 举报

2

主题

54

帖子

34.00

积分

新手上路

Rank: 1

积分
34.00
 楼主| 发表于 2020-6-3 10:15:02 | 显示全部楼层
这个想法也有道理,谢谢
回复

使用道具 举报

0

主题

55

帖子

44.00

积分

新手上路

Rank: 1

积分
44.00
发表于 2020-6-4 10:15:01 | 显示全部楼层
各编译器下会各不相同。
尽量少用union和位域。
回复

使用道具 举报

2

主题

54

帖子

34.00

积分

新手上路

Rank: 1

积分
34.00
 楼主| 发表于 2020-6-4 16:15:01 | 显示全部楼层
superandy有这方面的资料说明么
回复

使用道具 举报

0

主题

55

帖子

44.00

积分

新手上路

Rank: 1

积分
44.00
发表于 2020-6-5 15:00:01 | 显示全部楼层
无其它资料,只有这一句话。
回复

使用道具 举报

2

主题

54

帖子

34.00

积分

新手上路

Rank: 1

积分
34.00
 楼主| 发表于 2020-6-5 18:00:01 | 显示全部楼层
...
那我的理解对么
通常做法是什么,一般的
回复

使用道具 举报

0

主题

73

帖子

46.00

积分

新手上路

Rank: 1

积分
46.00
发表于 2020-6-7 18:45:02 | 显示全部楼层
我觉得首先应该想到,C++语言中的union和位域,在很大程度上是为了兼容C而留下的,这一事实本身就容易导致语言的设计者只是想兼容它们,而并不想让他们再跟语言的其它特性“完美地”融合在一起,换句话说,在保证最大程度兼容的基础上,别惹麻烦就可以了,越简单越好。

关于引用,非POD类可否作union的成员,这个应该随便就可以想出一大堆否定的理由,比如:
(1)引用在语法上是另一个对象的别名,那么,你如何想象一个union实例,它可以是个int,同时又可以是一个“double的别名”?(这比“可以是int,同时也可以是个double”难理解多了)
(2)定义一个union实例一般不带显式初始化的,那么你如何像它的某个成员(同时也是其它所有成员的共同载体)却必须在定义时明确初始化?
(3)operator=的处理过程中往往会先清理先前的对象内容,如何让一个成员负责清理另一个成员的信息?
(4)共享着同一块内存的两个对象若都有析构函数,那么整个union实例终止时,析构谁呢?
(5)同样,创建一个union实例时,默认又调用谁的构造函数呢?
(6)如果其中某一个成员没有默认构造函数又怎么办?
总之,非POD的对象本来就可能无比复杂,“两个对象共用同一块内存”,天哪,——还是不要继续想下去了吧。:P

union中不能有static成员,一可能是为了兼容,二也确实意义不大。位域也同样吧。
C++兼容了它们,同时当然也要尽量不改变它们在C语言中被设计出来时的设计初衷。(想想在C语言中,位域和union都是做啥用的?为union加上一个static成员,或者让位域作static成员,应该都是当初它们的设计者所从未考虑过的事情)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表