两者没什么联系,主要是个人会将其概念混乱,所以记录一下
联合体
共用同一内存空间;同一个内存空间中存储不同的数据类型,联合体也叫共用体,定义联合体的关键字是union
定义一个联合类型的一般形式为:
成员表中含有若干成员,成员的一般形式为: 类型说明符 成员名。其占用的字节数为成员中最大数据类型占用的字节数。
与结构体(struct)、枚举(enum)一样,联合体也是一种构造类型:
union 联合名
{
成员表
};
联合体的应用示例
检测当前处理器是大端模式还是小端模式?
union MyUnion
{
short value;
char bytes[2];
}test;
int len = sizeof(short);
int len1 = sizeof(test);
test.value = 0x0102;
if ((test.bytes[0] == 1) && (test.bytes[1] == 2))
{
cout << "大端字节序" << endl;
TRACE("大端字节序");
}
else if ((test.bytes[0] == 2) && (test.bytes[1] == 1))
{
cout << "小端字节序" << endl;
TRACE("小端字节序\n");
}
else
{
cout << "未知" << endl;
}
内联函数
内联函数可以避免函数调用的开销,在函数的返回类型前面加上inline就可以声明为内联函数
内联机制用于优化规模小,流程直接,频繁调用的函数。内联机制既具备宏代码的效率又增加了安全性,所以可以尽量使用内联函数来代替宏定义。
inline const string&shortstring(const string &s1,const string &s2)
{
return s1.size()<=s2.size()?s1:s2;
}
使用内联函数的缺点也是非常明显的,编译后的程序会存在多份相同的函数拷贝,如果被声明为内联函数的函数体非常大,那么编译后的程序体积也将会变得很大,所以再次强调,一般只将那些短小的、频繁调用的函数声明为内联函数。
内联能提高函数的执行效率,那么为什么不把所有的函数都定义成内联函数呢?
内联以代码膨胀(拷贝)为代价,仅仅省区了函数调用的开销,从而提高程序的执行效率。(开销指的是参数的压栈、跳转、退栈和返回操作)。
如果执行函数体内代码的时间比函数调用的开销大得多,那么inline效率收益会很小。
每一处内联函数的调用都要拷贝代码,使程序的总代码量增大,消耗更多的内存空间。
如果函数体内代码比较长,使用内联将导致可执行代码膨胀过大。
如果函数体内出现循环或者其他复杂的控制结构,那么执行函数体内代码的时间将比函数调用的开销大得多。