union的用法是节约内存还是方便初始化 ? 5
对于共用体的不同成员赋值,将会对其它成员重写,原来成员的值就不存在了,而对于结构体的不同成员赋值是互不影响的.例如以下定义:unionkeyFlag{struct{uns...
对于共用体的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于结构体的不同成员赋值是互不影响的.
例如以下定义:
union keyFlag{
struct {
unsigned deal0 : 1;
unsigned deal1 : 1;
unsigned deal2 : 1;
unsigned deal3 : 1;
unsigned deal4 : 1;
unsigned effect : 1;
}bits;
uchar AllBits;
};
volatile union keyFlag keyF;
我在主程序中定义 keyF.AllBits = 0;
那么 意思是共用体其他值丢失?默认为0吗》?如果不丢失,当keyF.AllBits = ff;是不是上面的位段全部为1了,因为占用同一个内存地址嘛?
用keyF.AllBits = 0;初始化。这样方便点吧才这样用的,一个定义就搞定全部初始化为0?还是节约空间? 展开
例如以下定义:
union keyFlag{
struct {
unsigned deal0 : 1;
unsigned deal1 : 1;
unsigned deal2 : 1;
unsigned deal3 : 1;
unsigned deal4 : 1;
unsigned effect : 1;
}bits;
uchar AllBits;
};
volatile union keyFlag keyF;
我在主程序中定义 keyF.AllBits = 0;
那么 意思是共用体其他值丢失?默认为0吗》?如果不丢失,当keyF.AllBits = ff;是不是上面的位段全部为1了,因为占用同一个内存地址嘛?
用keyF.AllBits = 0;初始化。这样方便点吧才这样用的,一个定义就搞定全部初始化为0?还是节约空间? 展开
2个回答
展开全部
都不是。
你得从内存的角度来理解。
比如一个int和一个char[4],如果是
struct{
int a;
char [4] b;
}
那在内存里是这样的
[ a ][b[3]b[2]b[1]b[0]]
而union则会使这样的
[ a ]
[b[3]b[2]b[1]b[0]]
至于用处,举个比较明显的,base64编码,是把3个8位共计24位通过移位变为4个6位的数据,再对应编码。
这样的运算会有跨边界问题,如果是char,则有8位,通过位运算显然有些复杂,那我们就用上面这个共用体,给b[2]b[1]b[0]分别赋值,然后再操作a进行移位操作,这样既简单又高效。
至于节约内存之说,主要指有些数据不会同时存在,例如老师没有成绩,学生没有工资,那么成绩和工资不会同时存在,那就都用一个float的共用体表示,但是实际使用的时候只访问一个。
至于你说的初始化的问题,在windows下通常使用ZeroMemory(一个memset函数的宏定义)来清零一个内存区域。
共用体有内存对齐问题,这个有兴趣自己查找相关资料吧
你得从内存的角度来理解。
比如一个int和一个char[4],如果是
struct{
int a;
char [4] b;
}
那在内存里是这样的
[ a ][b[3]b[2]b[1]b[0]]
而union则会使这样的
[ a ]
[b[3]b[2]b[1]b[0]]
至于用处,举个比较明显的,base64编码,是把3个8位共计24位通过移位变为4个6位的数据,再对应编码。
这样的运算会有跨边界问题,如果是char,则有8位,通过位运算显然有些复杂,那我们就用上面这个共用体,给b[2]b[1]b[0]分别赋值,然后再操作a进行移位操作,这样既简单又高效。
至于节约内存之说,主要指有些数据不会同时存在,例如老师没有成绩,学生没有工资,那么成绩和工资不会同时存在,那就都用一个float的共用体表示,但是实际使用的时候只访问一个。
至于你说的初始化的问题,在windows下通常使用ZeroMemory(一个memset函数的宏定义)来清零一个内存区域。
共用体有内存对齐问题,这个有兴趣自己查找相关资料吧
更多追问追答
追问
那我们就用上面这个共用体,给b[2]b[1]b[0]分别赋值,然后再操作a进行移位操作.
你 的意思我理解为:变a,B[]的值也会变?那可以用共用体初始化啊?
[ a ]
[b[3]b[2]b[1]b[0]]
如果不是,意思是用a的时候另外一个b【】不存在?也不会默认为0?
追答
不是,是他们共用内存空间,举个例子,
union{
int a;
int b;
}
这样一个共用体,a和b是一回事。这没问题。
union
{
int a;
char b;
}
这个就不一样了,a占4字节,b占1字节,如果b赋值为0,a未必就是0。
但是这还涉及内存对齐的问题,你可以查找相关资料。
笼统来说就是 按照最大内存占有的来算,然后其余的变量,共用这块内存。你更改了某一个变量,相当于更改了其他的变量,但是变更的结果,取决于内存占有量。一般而言,将最大的那个清0,其他的也就清0了。反之则未必。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询