一块内存不同的访问方式

// 1.数组的便捷访问
// 一块内存两种等价的访问方式
template <typename T>
union Mat4x4 {
struct{
T m00, m01, m10, m11;
};
T m[][];
}; int main(int argc, const char * argv[])
{
Mat4x4<float> mat = {,,,}; std::cout<< mat.m00 <<std::endl;
std::cout<< mat.m[][] <<std::endl;
// output: 1
// 1
return ;
}

将变量拆成字节访问

int main(int argc, const char * argv[])
{
union Int4 {
struct {
unsigned char _1, _2, _3, _4;
};
int _int;
}; Int4 integer;
integer._int = ;
printf("%08X\n", integer._int);
printf("%02X\n", integer._1);
printf("%02X\n", integer._2);
printf("%02X\n", integer._3);
printf("%02X\n", integer._4);
// output:
// 05F5E100
// 00
// E1
// F5
//
return ;
}

判断CPU大小端问题

int big_endian (void)
{
union{
long l;
char c[sizeof(long)];
}u; u.l = ;
return (u.c[sizeof(long) - ] == );
} int main(int argc, const char * argv[])
{
//在大端格式中,字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中
//与大端存储格式相反,在小端存储格式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节
if(!big_endian()) {
printf("CPU是小端模式\n");
}
else {
printf("CPU是大端模式\n");
}
}
// 这样判断大小端更简洁
bool is_big_endian(void)
{
unsigned int test = 0xff000000;
return (*(unsigned char *)&test == 0xff);
}

Union的内存占用

首先内存占用肯定是要大于最大的一项,其次因为内存对齐的缘故

int main(int argc, const char * argv[])
{
// # 内存问题
union Max {
char _1;
int _4;
double _8;
char _17[];
}; printf("size: %lu\n", sizeof(Max));
// output: size: 24 return ;
}

使用注意

Union是C语言的东西,当然C++中也会有了,但是Union在C++中有些需要注意的地方。

由于union里面的东西共享内存,所以不能定义静态、引用类型的变量。

下面是错误的代码:

union Test {
static int c;
int &ref;
};

C语言中没有类的概念,更没有构造和析构函数,Union中如果存在C++对象,那么C++对象必须不能存在构造和析构函数,

默认的构造和析构不会被调用,存C++对象指针是没问题的。

union TestUnion {

    class {
public:
//去掉注释会发生错误
//TestClass() {
// printf("构造\n");
//}
//~TestClass() {
// printf("析构\n");
//} int var;
} c; }; int main(int argc, const char * argv[])
{
TestUnion t = {};
printf("var: %d\n", t.c.var);
return ;

所以,我们在C++中使用union时,尽量保持C语言中使用union的风格,尽量不要让union带有对象。

Union的妙用和注意的更多相关文章

  1. C++ Union妙用(将列表初始化用于数组元素)

    Union是个不被注意的关键字,意为联合体,这是个诡异的名字.若不是为了继承C语言,它也不会出现在C++中(虽说,union在C++中得到了扩充,完成了接近类的功能).它的作用主要是节省内存空间,在嵌 ...

  2. (C语言)共用体union的使用方法举例

    曾经在学校学习C语言的时候一直搞不懂那个共用体union有什么用的.工作之后才发现它的一些妙用,现举比例如以下: 1. 为了方便看懂代码. 比方说想写一个3 * 3的矩阵,能够这样写: [ 注:以下用 ...

  3. C语言union关键字,union和struct区别

    union 关键字的用法与struct 的用法非常类似. union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间 ...

  4. 【CSS进阶】伪元素的妙用--单标签之美

    最近在研读 <CSS SECRET>(CSS揭秘)这本大作,对 CSS 有了更深层次的理解,折腾了下面这个项目: CSS3奇思妙想 -- Demo (请用 Chrome 浏览器打开,非常值 ...

  5. SQL Server-聚焦UNIOL ALL/UNION查询(二十三)

    前言 本节我们来看看有关查询中UNION和UNION ALL的问题,简短的内容,深入的理解,Always to review the basics. 初探UNION和UNION ALL 首先我们过一遍 ...

  6. angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用

    今天我们要讲的是ng2的路由系统. 例子

  7. SQL 提示介绍 hash/merge/concat union

    查询提示一直是个很有争议的东西,因为他影响了sql server 自己选择执行计划.很多人在问是否应该使用查询提示的时候一般会被告知慎用或不要使用...但是个人认为善用提示在不修改语句的条件下,是常用 ...

  8. JavaScript的妙与乐(一)之 函数优化

    JavaScript的妙与乐系列文章主要是展示一些JavaScript上面比较好玩一点的特性和一些有用的技巧,里面很多内容都是我曾经在项目中使用过的一些内容(当然,未必所有技巧的使用频率都很高^_^) ...

  9. Promise的前世今生和妙用技巧

    浏览器事件模型和回调机制 JavaScript作为单线程运行于浏览器之中,这是每本JavaScript教科书中都会被提到的.同时出于对UI线程操作的安全性考虑,JavaScript和UI线程也处于同一 ...

随机推荐

  1. nscd

    作用: Nscd is a daemon that provides a cache for the most common name service requests 可以缓存passwd,grou ...

  2. fstab文件

    格式: 文件系统 挂载点 格式 挂载文件系统选项 备份选项 自检选项 1.指定挂载的设备或者远程文件系统,比如普通的挂载设备/dev/sda1, 对于nfs格式:<host>:<di ...

  3. R语言绘图002-页面布局

    par().layout().split.screen()函数 1. par()函数的参数详解 函数par()可以用来设置或者获取图形参数,par()本身(括号中不写任何参数)返回当前的图形参数设置( ...

  4. 二分---LIGHTOJ 1062

    1062 - Crossed Ladders PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB A ...

  5. memcached使用说明

    1.在服务器上注册服务 2.启动服务:services.msc       3.客户端创建服务接口 object Get(string key); List<string> GetKeys ...

  6. 【BZOJ】【1028】【JSOI2007】麻将

    暴力/模拟 $n\leq400$,嗯……这是一个很小的数据范围= = 判断一副牌是不是听牌并求出听什么牌太麻烦了,干脆我们直接判是不是胡牌好了~ 枚举胡的是哪张牌,然后判一下加上这张牌后是否能胡. 算 ...

  7. asp.net 创建文字特效

    相信word 中的 艺术字 功能大家都不陌生.今天, 我们就利用C#来制作几款自己的艺术字, 可能会对我们了解字体图像的制作原理有一些帮助. 至于有没有使用价值我保持沉默. 一. 投影效果 程序运行效 ...

  8. 用dedecms自定义表单创建简易自助预约系统

    建站往往需要根据客户的需求来增加相应的功能,比如预约.平时用比较多的是织梦系统,那么如何用dedecms自定义表单创建简易自助预约系统呢? 进入dedecms后台,左侧菜单中依次点击“核心” - 频道 ...

  9. ErrorCode枚举类型返回错误码信息测试,手动抛出异常信息,在事务中根据错误码来回滚事务的思路。

    ErrorCode.java 简单测试代码,具体应用思路:手动抛出异常信息,在事务中根据错误码来回滚事务的思路. public enum ErrorCode { //系统级 SUCCESS(" ...

  10. HDU 1715 大菲波数(JAVA, 简单题,大数)

    题目 //BigInteger 和 BigDecimal 是在java.math包中已有的类,前者表示整数,后者表示浮点数 import java.io.*; import java.util.*; ...