//首先,学习编程一定要记得加几个群或者加几个讨论组,因为这样你才能不断地进步还有吵架/滑稽

记一下 关于使用union结构体时遇到的一些坑

To zero-initialize an object of type T means:
— if T is a scalar type (3.9), the object is set to the value of (zero) converted to T;
— if T is a non-union class type, each nonstatic data member and each base-class subobject is zeroinitialized;
if T is a union type, the object’s first named data member89) is zero-initialized;
— if T is an array type, each element is zero-initialized;
— if T is a reference type, no initialization is performed.
To default-initialize an object of type T means:
— if T is a non-POD class type (clause ), the default constructor for T is called (and the initialization is
ill-formed if T has no accessible default constructor);
— if T is an array type, each element is default-initialized;
— otherwise, the object is zero-initialized.
//这是C++标准里的截取的一小片段,加粗放大的那一句。

然后我就臆想了呀,关于如果声明一个局部变量union,第一个数据缺省初始化为 ”zero“(我感觉这么写比较好

但是万万没想到啊,用起来,union object zero initalize如果union object为全局变量,的确是结构体中的第一个变量为zero,但是,如果为局部变量的化就不一定了《编译器不同,数据也不同

也就是说标准给的这个不包括局部变量(block);

union 里面的元素默认为public类型,union没有constructor function 和 destructor function,因为这两个函数被delete。可以自己定义《鄙人认为现在的条件如果用到面向对象了,应该不会在乎这点内存吧,当然如果对象特别大的话《那我也不会union,我可以用指针啊,如果你说,我这个结构体中的几个变量,每次用的时候都会给初值,并且用的次数不多,那你用union吧,我反正不用。

//这就是构造和析构函数 
union MYUNION{
char avs[];
char s[];
MYUNION(){
strcpy(avs,"abs");
}
~MYUNION(){
}
}a;

还是我在标准中标粗的那句话,第一个就是第一个,你别想着大的为零,下面看代码

 union MYUNION{
char avs[];
char s[]; }a;
//这个 第一行初始为zero 也就是说他的一百个char 全是zero,后面的两个也是zero
//然后 换一下
 union MYUNION{
char avs[2];
char s[100]; }a;
//这样就是第一行的两个字节被声明了zero,如果输后面的98个就不是zero了

这是一个比较坑的地方要注意。

在数据结构教程第五版 p184 页有提到过,广义表的实现也用到了union这个结构体《只能有一种存在,是这一种,另一种就不是了,这就说了我如果有一个对象,他有两个特性,一个是a,一个是b,我用了a就不能用b,用了b就不能用a,我还想省下一些内存。这样我可以将他封进class/struct中

typedef struct lnode{
int tag;
union{
int data;
struct lnode *sublist;
}val;
struct lnode *link;
}GYB;

union的总结也就到这儿了吧,写的有点乱,如果有哪位博友看到问题或者其他排版问题  /*欢迎评论和私聊*/

C++/C union使用记一下锅的更多相关文章

  1. 关于数据库的左,右,内,外连接,Union和Union all---------笔记

    1.左连接 select a.filed1,a.filed2,b.filed1 from a (左表) left join b(右表) on a.commonfiled = b.commonfiled ...

  2. 记一个小bug的锅

    人生中的第一个线上bug 我参与的第一个项目就出现了.但是自己还觉得这锅也不全是自己的,毕竟那么明显的bug出现在历史模块中(不是我写的新模块),难道测试部就没一点责任?代码走查人员就没一点责任?不过 ...

  3. 记一次mysql请求超时甩锅历程

    今天下午业务找我说是线上环境一个mysql库很慢,请求出现了大量的超时,让帮忙看看,以下为查找过程及甩锅过程. 1. mysql请求超时,ok,我们所有线上mysql都是开启了慢查询日志的,查找慢查询 ...

  4. 记一次ssh配置的锅

    我们在使用git来管理代码的时候不可避免的要用到ssh密匙,这个密匙怎么配置的百度上很多. 我这边是使用sourcetree来配合管理代码的,但是我ssh配置好了以后无论是克隆代码还是推送代码都提示我 ...

  5. Spark踩坑记——Spark Streaming+Kafka

    [TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...

  6. CTSC2016&&APIO2016滚粗记&&酱油记&&游记<del>(持续更新)</del>

    挖一波坑 #include <cstdio> using namespace std; int main(){ puts("转载请注明出处:http://www.cnblogs. ...

  7. SHOI2016游记&滚粗记&酱油记

    Day0 学校刚期中考完,全科血崩,感觉这次真要考不到一本线了tat 晚上写了个可持久化trie的题,也懒得敲板子(上个礼拜都敲过了),就碎叫了 Day1 上午起床吃饭水群看球,吃完中饭就去考场了. ...

  8. union和union all的区别

    UNION 写一篇联合查询(把前后两个表的查询结果集合在前表中)首先有个为什么需要 相同记录数?? 记错了.应该是union两张表的查询字段数目要一致,字段类型要相似相同的数据类型,至少是相似,可转化 ...

  9. gedit配置记

    gedit配置记 起因 突然感觉sublime用用这里那里不方便(虽然很好看> >),然后稍微手调了一下gedit发现gedit还是非常可用的(雾)... 阶段一 我感觉sublime各种 ...

随机推荐

  1. ARP协议(4)ARP编程

    之前的几篇文章,分别介绍了 ARP 协议格式,在vs2012里配置winpcap环境,我们该做的准备都已经做完了.如今我们真正来实现了. 一.定义数据结构 依据ARP的协议格式,设计一个ARP协议格式 ...

  2. CodeForces 731F Video Cards (数论+暴力)

    题意:给定 n 个数,可以对所有的数进行缩小,问你找出和最大的数,使得这些数都能整除这些数中最小的那个数. 析:用前缀和来做,先统计前 i 个数中有有多少数,然后再进行暴力去找最大值,每次都遍历这一段 ...

  3. E20180121

    signature  n. 签名; 署名; 识别标志,鲜明特征; [医] 药的用法说明;

  4. Unity资源的查找

    Object.Destroy static function Destroy(obj: Object, t: float = 0.0F): void;   Description Removes a ...

  5. bzoj 2165: 大楼【Floyd+矩阵乘法+倍增+贪心】

    1<<i的结果需要是long long的话i是long long是没用的--要写成1ll<<i--我别是个傻子吧 虽然写的是二进制贪心,但是我觉得二分可能更好写吧(但是会慢) ...

  6. bzoj 1016: [JSOI2008]最小生成树计数【dfs+克鲁斯卡尔】

    有一个性质就是组成最小生成树总边权值的若干边权总是相等的 这意味着按边权排序后在权值相同的一段区间内的边能被选入最小生成树的条数是固定的 所以先随便求一个最小生成树,把每段的入选边数记录下来 然后对于 ...

  7. Sql 主键设置

    1.开发数据库时常用命名规范 1>.使用不包含数字的单数表名,如果必要的话可以增加模块名前缀. 2>.对于主键的命名,使用表名+ID的形式. 3>.作为外键的列的名字应该与它们所对应 ...

  8. WebSphere设置会话超时时间

    WebSphere Application Server的会话超时时间可以在三个层面进行设置,分别为:应用程序服务器级别.应用程序级别和代码层面进行设置. 设置方式:应用程序级别级别和应用级别可以通过 ...

  9. jQuery学习笔记(5)-事件与事件对象

    一.前言 主要讲解事件的绑定与触发 二.jQuery中添加事件 1.使用bind()方法绑定事件 <input id="btn" type="button" ...

  10. maven build过程中遇到的问题以及解决方案

    (1)不支持泛型以及@Override 问题来源:使用了低版本的jdk,默认情况下maven使用的是jdk1.5的版本,而泛型和@Override是后期版本才有的,需要更改maven默认的jdk版本. ...