C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 为什么禁止对bitfields的非const引用?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
C 11中的第9.6 / 3节非常清楚:“非常量参不应与位域绑定”.这个禁令背后的动机是什么?

我明白,不可能直接将引用绑定到位域.但是如果我宣布这样的话,

struct IPv4Header {
  std::uint32_t version:4,// assumes the IPv4 Wikipedia entry is correct
                IHL:4,DSCP:6,ECN:2,totALLENgth:16;
};@H_675_5@ 
 

为什么我不能这样说?

IPv4Header h;

auto& ecn = h.ECN;@H_675_5@ 
 

我期望底层代码实际绑定到包含我感兴趣的位的整个std :: uint32_t,我期望读写操作生成代码来做适当的掩码.结果可能是大而缓慢,但在我看来,它应该工作.这与标准说对const bitfields的引用是一致的(再次从9.6 / 3)是一致的

这表明写入bitfields是问题,但我看不到它是什么.我虑了必要的掩蔽可能在多线程代码中引入种族的可能性,但是,对于每个1.7 / 3,非零宽度的相邻位字段被认为是用于多线程的单个对象.在上面的示例中,IPv4Header对象中的所有位域将被视为单个对象,因此,根据定义,尝试在读取其他字段时修改字段的多线程代码已经是racy.

我显然错过了一些东西.它是什么?

解决方法

指针不能指向位字段,因此非const引用不能绑定到位域.

然没有指定引用是否占用存储,但显而易见的是,在非平凡的情况下,它们被实现为伪装的指针,并且引用的这种实现是由该语言的作者“意图”的.就像指针一样,引用必须指向可寻址的存储单元.将非常量引用绑定到不可寻址的存储单元是不可能的.由于非const引用需要直接绑定,因此非常量引用不能绑定到位字段.

产生可以指向位域的指针/引用的唯一方法是实现某种“超级指针”,除了存储器中的实际地址还将包含某种位偏移和位宽信息之外,为了告诉写代码哪些位要修改.请注意,此附加信息必须存在于所有数据指针类型中,因为C中没有类似于“bit / field”的指针/引用.这基本上等同于实现更高级别的存储寻址模型,与基础OS /硬件平台提供的寻址模型完全分离. C语言从来没有意图从纯粹的效率虑中要求从底层平台的抽象.

一种可行的方法是引入单独的指针/引用类别,例如“指针/引用到位字段”,其将具有比普通数据指针/引用更复杂的内部结构.这样的类型可以从普通的数据指针/引用类型转换,而不是相反.但它似乎并不值得.

在实际的情况下,当我必须处理打包成位和序列的数据时,我经常更喜欢手动实现位域,并避免使用语言级的位字段.位字段的名称一个编译时实体,不需要任何类型的运行时选择.当需要运行时选择时,更好的方法是声明一个普通的uint32_t数据字段,并手动管理其中的各个位和组.这种手动“位域”的运行时间选择可以通过掩码和移位(两者都可以是运行时值)轻松实现.基本上,这接近手动实施上述“超级指针”.

大佬总结

以上是大佬教程为你收集整理的c – 为什么禁止对bitfields的非const引用?全部内容,希望文章能够帮你解决c – 为什么禁止对bitfields的非const引用?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。