草庐IT

quick-union

全部标签

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

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

c++ - Qt Quick Controls 2.0 文本域无法选择文本

我在选择TextField上的文本时遇到困难从QtQuickControls2.0使用鼠标。当我将鼠标悬停在TextField上时,光标不会从光标箭头变为我发射的光标,我无法选择文本。我通过使用键盘快捷键Ctrl+A验证了文本选择是可能的。我还用TextField测试了这个来自QtQuickControls1.4,它按预期工作(鼠标光标变为工字形,我可以选择文本)。我想我一定遗漏了一些明显的东西,因为这看起来像是基本的文本字段功能。有人有什么想法吗?下面是我的代码:importQtQuick2.7importQtQuick.Controls2.0importQtQuick.Layout

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

c++ - 包含包装类型和类型本身的 union 是否有任何保证?

我可以将一个T和一个包装的T放在一个union中并根据需要检查它们吗?unionExample{Tvalue;structWrapped{Twrapped;}wrapper;};//forsimplicityT=intExampleex;ex.value=12;coutC++11标准只保证公共(public)初始序列的保存检查,但value不是struct。我猜想答案是否,因为wrappedtypesaren'tevenguaranteedtobememorycompatibletotheirunwrappedcounterpart和accessinginactivemembersis

c++ - 通过 union 合法访问 __m128 变量的字节吗?

考虑这个变量声明:union{struct{floatx,y,z,padding;}components;__m128sse;}_data;我的思路是通过x,y,z字段赋值,进行SSE2计算,通过读取结果x、y、z。不过,我有点怀疑它是否合法。我关心的是对齐:MSDN说__m128变量自动对齐到16字节边界,我想知道我的union是否可以打破这种行为。这里还有其他陷阱需要考虑吗? 最佳答案 union的对齐应该没问题,但在Windows的情况下,您可以直接访问32位组件。来自xmmintrin.h(DirectXMath):type

C++:严格别名与 union 滥用

提前为第一个可能很愚蠢的帖子道歉。虽然有很多关于这个主题的Material,但其中很少有是确定的和/或对我来说可以理解的。我有一个AlignedArray模板类,可以在堆上以任意对齐方式动态分配内存(AVX汇编例程需要32字节对齐)。这需要一些丑陋的指针操作。AgnerFog在cppexamples.zip中提供了一个示例类,它滥用union来实现这一点(http://www.agner.org/optimize/optimization_manuals.zip)。但是,我知道写入union的一个成员然后从另一个成员读取会导致UB。AFAICT将任何指针类型别名为char*是安全的,但