草庐IT

UNION-ed

全部标签

c++ - C++17 标准是否保证 union 的地址与其成员的地址相同?

我目前正在编写一个池分配器。我的问题归结为以下代码:templateunionmyUnion{Tdata;myUnion*nextUnion;};voidsomeFunction(){myUnionmu;T*t=new(std::addressof(mu.data))T();//somecodemyUnion*mu2=reinterpret_cast*>(t);}mu的地址总是和mu2一样吗? 最佳答案 是的。9.2/19(N4659中为12.2/24):Ifastandard-layoutclassobjecthasanynon-

c++ - map 的 union 迭代器?

[前言:像std::map这样的关联C++容器有点像只有一个键列的微型数据库。Boost的bimap将其提升为一个双列表,在两列中进行查找,但仅此而已——没有“polymap”概括这个想法。]无论如何,我想继续将map视为数据库,现在我想知道是否有一个迭代器(或其他解决方案)允许我对几个组成map进行UNION。也就是说,所有映射都具有相同的类型(或值类型和比较器,至少),我想要一个迭代器将整个集合视为一个大的多映射(重复的键是可以的)并让我在正确的union中遍历它订单。这样的东西是否存在,也许在Boost中?或者很容易组装一个?在伪代码中:std::mapm1,m2;union_i

c++ - 为什么libc++的map实现要用这个union?

#if__cplusplus>=201103Ltemplateunion__value_type{typedef_Keykey_type;typedef_Tpmapped_type;typedefpairvalue_type;typedefpair__nc_value_type;value_type__cc;__nc_value_type__nc;template_LIBCPP_INLINE_VISIBILITY__value_type(_Args&&...__args):__cc(std::forward(__args)...){}_LIBCPP_INLINE_VISIBILITY_

C++11 "In class initialization"功能不适用于 union

最小代码示例:structB{unionU{structS{}s;inti=100;}u;};现在,如果我们声明一个Bobj;,那么obj.u.i会被分配一个垃圾值而不是100。查看demohere.(垃圾值因优化标志等而异)。“类内初始化”功能是否应该与union一起使用。如果是,那么正确的语法是什么?或者这是一个g++错误?如果不是,那么inti=100;做什么? 最佳答案 这看起来像一个GCC错误。标准说(9.5p2):Atmostonenon-staticdatamemberofaunionmayhaveabrace-or-

c++ - const union成员有什么用?他们不是毫无意义吗?

在对此answer的评论中,Koushik提出了veryvalidpoint.采取以下措施:unionU{intx;constTy;};(我选择T这样这里就没有布局兼容性的通用初始序列,这意味着根据[C++11:9.5/1].)因为任何时候只有一个成员可能是“活跃的”(通过写入使其活跃),并且y不能在初始化后写入,这不是毫无意义吗?我的意思是,y只能在第一次写入x之前被读取,并且只有当y是初始化成员时。我是否遗漏了一些用例?或者这确实是语言功能的毫无意义的融合?(Thishasbeenmentionedbefore) 最佳答案 这是

c++ - 我可以在内存初始化器中初始化 union 吗?

我很惊讶这不起作用:unionDlDatum{floatmFloat;s32mInteger;};classDlDbE{public:DlDbE(floatf):mData.mFloat(f){};private:DlDatummData;};有没有办法在C++构造函数内存初始化器列表中初始化union?更新:答案是为union创建构造函数。不知道那可以做到。这是我所做的:unionDlDatum{floatmFloat;s32mInteger;boolmBoolean;u32mSymbol;u32mObjIdx;DlDatum():mInteger(0){}DlDatum(float

c++ - 如何用 0 memset 匿名 union

我应该如何将匿名union归零?我在cppreference上找不到任何内容关于它的页面。memset它最大的成员0在这里工作吗?例如-#include#includestructs{chara;charb[100];};intmain(){union{inta;sb;charc;};//b.a='a';(1)std::memset(&b,0,sizeof(b));std::cout此外,如果这行得通,我是否应该在使用memset()激活最大成员之前取消注释(1)? 最佳答案 如果你真的想尊重标准,你应该知道你写的代码是未定义的行为

C++11 空列表 union 的初始化 - 是否保证初始化 union 的全长?

在C++11中,我有以下union:unionSomeData{std::uint8_tByte;std::uint16_tWord;std::uint32_tDWord;unsignedcharString[128];};如果我这样初始化union;SomeDatadata{};是否保证union的全部内容将被“清零”?换一种方式;是union的空列表初始化器在功能上等同于将union内存设置为零?:memset(&data,0,sizeof(data));我特别关心字符串数据。我想确保字符串的整个长度都包含零。它似乎适用于我当前的编译器,但规范的语言是否保证它始终为真?如果不是:是

c++ - 命名数组元素,或 union 内的结构和数组

考虑以下结构:structVector4D{union{doublecomponents[4];struct{doublex,y,z,t;}Endpoint;};};在我看来,我在WinApi的IPAddress结构中看到了类似的东西。这个想法是让我可以通过索引和名称使用数组组件,例如:Vector4Dv;v.components[2]=3.0;ASSERT(v.Endpoint.z==3.0)//let'signoreprecisionissuesfornow在C++标准中,保证POD结构的开头没有“空白”空间,也就是说,元素x将位于Endpoint结构的开头。目前很好。但我似乎没有

c++ - 什么是 union ?

最近我在windows上工作,我发现很多数据结构被定义为struct和union作为成员变量。这方面的示例是Windows中的EVT_VARIANT。我不明白这背后的目的是什么。 最佳答案 当struct包含union成员时,通常是作为一种节省空间的机制来完成的。如果struct可以是某些子类型,只有某些成员有效,那么union是不浪费空间的好方法。例如enumNumberKind{Integer,FloatingPoint};structNumber{NumberKindkind;union{intintegerValue;flo