草庐IT

c++ - 成员结构位域元素的初始化列表初始化导致 IAR ARM 中的错误

我在IAR中有以下类结构:classA{public:A(){}virtual~A(){};virtualvoidload(){};};classC{public:C(){//Cdoesotherstuff,notrelevant}};classD;classB:publicA{public:B():invert(false){};virtual~B(){};voidload(){//Irrelevantstuffdonehere}private:Cmember_c;std::vectorvector_of_d;struct{boolvar_1:1;boolvar_2:1;boolva

c++ - 当使用位域 union 替换位掩码时,访问非事件成员,好还是未定义?

来自thisquestion我了解到匿名结构和union已成为C11标准的一部分(来自评论)。然后我想用bitfieldunion来代替bitmask可能是个好主意,我发现其他人已经发布了一个问题并显示了anexample。,这和我的想法完全一样。该问题的答案同意使用位域union方法替换位掩码的安全性。但是,thepostthere的答案,据我了解,否认访问不活跃的union成员的安全性,说访问不活跃的union成员是未定义的行为。我认为这两个问题的答案是矛盾的:仅使用theexamplethere,在修改.user后,.raw的值会变成undefined(通过对thepost的回答

c++ - 结构和位域成员排序

这个问题在这里已经有了答案:Doclass/structmembersalwaysgetcreatedinmemoryintheordertheyweredeclared?(6个答案)关闭6年前。a)结构b)位域中成员的顺序是否有保证?换句话说,给定一个结构或位域的某个成员,我是否保证它从结构/位域开始的偏移量不小于它前面的成员的大小之和?举个例子:structS{chara[N];unsignedb:M;charc:O;};c的偏移量是否至少为sizeof(a)+sizeof(b)?

c++ - 如何安全地将更宽的整数类型转换为位域?

考虑以下代码。#includestructMaskAndCount{uint64_toccupied:56;uint8_tnumOccupied:8;};intmain(){intcount=7;MaskAndCountfoo;foo.occupied&=~(1L如果我用-Wconversion编译这段代码,那么我会得到以下错误。g++-WconversionMain.ccMain.cc:Infunction‘intmain()’:Main.cc:11:18:warning:conversionto‘longunsignedint:56’from‘longunsignedint’may

c++ - Typedef C++ 中的位域/掩码

我在C++中遇到这个问题:我可以typedef一个值来自枚举的位域吗?代码将更具解释性:typedef{AUDIO=0x01,VIDEO=0x02,SUBTITLE=0x04,DATA=0x08,GUARD,ALL=0xFF}my_enum_e;//I'dliketoreplace'unsignedint'by'my_enum_e'orsimilarintmyFunction(unsignedintmask){//code}//calledlikethis:myFunction(AUDIO|VIDEO|DATA);在函数的原型(prototype)中,我想使用my_enum_e作为输入

c++ - 位域的完美转发解决方法

我正在寻找bit-fieldinoverloadresolutionfortemplate的解决方法.我有一个函数,我为它的参数的完美转发做了模板化:templatevoidf(Args&&...args){}如果我尝试将它与位域参数一起使用,如下所示:structbits{unsignedintfoo:1;};bitsb{1};f(b.foo);…编译失败:main.cpp:26:7:error:non-constreferencecannotbindtobit-field'foo'f(b.foo);^~~~~有没有一种方法可以重载f(),使其按值获取位域,但在常见情况下仍按引用获取

c++ - 用位域打包 bools (C++)

我正在尝试使用C++与Ada代码进行交互,因此我正在使用位字段定义一个结构,以便所有数据在两种语言中都位于同一位置。以下内容不完全是我在做什么,但概述了问题。以下也是VS2008中的控制台应用程序,但这不是特别相关。usingnamespaceSystem;intmain(){intarray1[2]={0,0};int*array2=newint[2]();array2[0]=0;array2[1]=0;#pragmapack(1)structtestStruct{//Word0(desired)unsigneda:8;unsignedb:1;boolc:1;unsignedd:21

C++ boolean 数组作为位域?

假设我需要在一个结构中存储8个boolean值,但我只想将它们一起使用1个字节,那么我可以这样做:structmyStruct{boolb1:1;boolb2:1;boolb3:1;boolb4:1;boolb5:1;boolb6:1;boolb7:1;boolb8:1;};有了这个我可以做类似的事情myStructasdf;asdf.b3=true;asdf.b4=false;if(asdf.b1)...到目前为止这是正确的吗?(我其实不知道,我以前从未使用过位域)好的-但是否也可以创建一个包含8个boolean值的静态数组,这样它们将仅使用8位,但我仍然可以通过索引对它们进行寻址?

c++ - 除了节省空间的明显好处之外,位域是否有任何隐藏的成本或好处?

这是声明位域的方式:unsignedm_bitfield1:2;//abitfieldthatoccupies2bitsunsignedm_bitfield2:1;//abitfieldthatoccupies1bit位域只是一个具有特定位大小的小域。我的问题是:我是否可以使用自己的算法来处理默认数据类型(例如占用大量不必要空间的整数或float)作为任意大小的较小部分的集合,或者使用位域有一些隐藏的好处?谢谢。 最佳答案 可以将整数用作您自己访问和管理的位的集合。但是经常有un-thought-ofcosts使用编译器生成的位字段

c++ - 线程安全和位域

我知道位域依赖于编译器,但我没有找到有关最新g++和VisualC++2010位域线程安全的文档。位域成员的操作是原子的吗? 最佳答案 不幸的是,“线程安全”在编程中是一个非常过载的术语。如果您指的是对位域的原子访问,答案是否定的(至少在我所知道的所有处理器上是这样)。您可以原子访问32位机器上的32位内存位置,但这仅意味着您将读取或写入整个32位值。这并不意味着另一个线程不会做同样的事情。如果您想要停止,您可能需要同步。如果您指的是对位域的同步访问,那么答案也是否定的,除非您将访问包装在更高级别的同步原语(通常基于原子操作)中。简