小标
2018-12-03
来源 :
阅读 1234
评论 0
摘要:本文主要向大家介绍了C/C++知识点之C语言Union,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。
本文主要向大家介绍了C/C++知识点之C语言Union,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。
对于Union我用的比较少,最近一段时间大多使用Lua,所以复习一下UnionUnion是共用体,顾名思义,公用一块内存
一块内存不同的访问方式
// 1.数组的便捷访问
// 一块内存两种等价的访问方式
template
union Mat4x4 {
struct{
T m00, m01, m10, m11;
};
T m[2][2];
};
int main(int argc, const char * argv[])
{
Mat4x4
std::cout<< mat.m00 <<std::endl;
std::cout<< mat.m[0][0] <<std::endl;
// output: 1
// 1
return 0;
}
将变量拆成字节访问
int main(int argc, const char * argv[])
{
union Int4 {
struct {
unsigned char _1, _2, _3, _4;
};
int _int;
};
Int4 integer;
integer._int = 100000000;
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
// 05
return 0;
}
判断CPU大小端问题
int big_endian (void)
{
union{
long l;
char c[sizeof(long)];
}u;
u.l = 1;
return (u.c[sizeof(long) - 1] == 1);
}
int main(int argc, const char * argv[])
{
//在大端格式中,字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中
//与大端存储格式相反,在小端存储格式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节
if(!big_endian()) {
printf("CPU是小端模式\n");
}
else {
printf("CPU是大端模式\n");
}
}
Union的内存占用
首先内存占用肯定是要大于最大的一项,其次因为内存对齐的缘故
int main(int argc, const char * argv[])
{
// # 内存问题
union Max {
char _1;
int _4;
double _8;
char _17[17];
};
printf("size: %lu\n", sizeof(Max));
// output: size: 24
return 0;
}
Union是C语言的东西,当然C++中也会有了,但是Union在C++中有些需要注意的地方。
由于union里面的东西共享内存,所以不能定义静态、引用类型的变量。由于在union里也不允许存放带有构造函数、析构函数和复制构造函数等的类的对象,但是可以存放对应的类对象指针。编译器无法保证类的构造函数和析构函数得到正确的调用,由此,就可能出现内存泄漏。所以,我们在C++中使用union时,尽量保持C语言中使用union的风格,尽量不要让union带有对象。
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!
喜欢 | 1
不喜欢 | 0
您输入的评论内容中包含违禁敏感词
我知道了

请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号