探究C/C++ typedef的秘密
Posted 泡沫o0
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了探究C/C++ typedef的秘密相关的知识,希望对你有一定的参考价值。
通过typedef简化C++代码
引言
a. C/C++语言中的类型别名简介
类型别名是C/C++编程语言中一种重要的概念,它允许程序员为已存在的数据类型定义一个新的名称。这种新名称可以用来简化代码,提高代码的可读性和可维护性。类型别名在C/C++中主要通过typedef关键字实现。
b. 为什么需要类型别名
提高代码可读性:类型别名可以为复杂的类型声明提供更简洁、易懂的名称,使得代码更加清晰,便于阅读和理解。
提高代码可维护性:当需要修改底层类型时,类型别名可以减少因类型更改而导致的错误。通过修改类型别名的定义,可以轻松地实现类型的全局更改,而无需逐个修改每个变量的类型。
支持跨平台开发:类型别名有助于解决跨平台兼容性问题。例如,在不同平台上,整数类型的大小可能会有所不同,通过使用类型别名,可以方便地为不同平台定义适当的整数类型。c. typedef关键字的作用
typedef关键字在C/C++中用于定义类型别名。它的主要作用如下:
为已存在的类型创建别名:typedef关键字可以为基本类型、结构体、联合体、数组和函数指针等类型创建别名。
简化复杂类型的声明:typedef关键字可以简化复杂类型的声明,例如函数指针类型和嵌套的结构体类型等。
提高代码的可读性和可维护性:通过使用typedef关键字,可以使代码更易于阅读和维护,尤其是在处理复杂类型和跨平台开发时。
综上所述,类型别名在C/C++编程中具有重要意义,它可以简化代码、提高代码质量,并支持跨平台开发。在接下来的章节中,我们将详细介绍typedef关键字的基本语法、实际应用、以及如何在实际开发中使用它的注意事项和最佳实践。
typedef的介绍
作用时间:在编译阶段有效,由于是在编译阶段,因此typedef有类型检查的功能。
功能:用来定义类型的别名
作用域:类似于定义变量的类型一样,若在main函数前,则相当于全局变量的作用域,若在函数中,则只在所在函数中作用。
typedef的使用场景
- 定义机器无关的类型,有利于程序的通用与移植。
对已经存在的类型增加一个类型名,而没有创造新的类型。有时程序会依赖于硬件特性**。**
typedef long double REAL;//在目标机器上它可以i获得最高的精度 typedef double REAL;//在不支持 long double 的机器上 typedef float REAL; //在连 double 都不支持的机器上
- 创建易于记忆的类型名
typedef int size //此声明定义了一个 int 的同义字,名字为 size
- 掩饰复合类型
typedef char Line[81]; //定义一个 typedef 的意思就是给 81 个字符元素的数组,起了一个昵称Line
typedef的使用陷阱
- typedef声明指针
typedef char * pstr; const pstr //被编译器解释为char * const(一个指向 char 的常量指针),而不是const char *(指向常量 char 的指针)
- typedef不能与其他存储类关键字共用
typedef register int FAST_COUNTER; // 错误编译通不过
typedef在语法上是一个存储类的关键字(如auto、extern、mutable、static、register等一样),虽然它并不真正影响对象的存储特性。问题出在你不能在声明中有多个存储类关键字。因为符号 typedef 已经占据了存储类关键字的位置,在 typedef 声明中不能用 register(或任何其它存储类关键字)。
“建立一个类型别名的方法很简单,在传统的变量声明表达式里用类型名替代变量名,然后把关键字typedef加在该语句的开头”。
typedef的使用示例
int* (a[5])(int, char); typedef int* (PF)(int, char);//PF是一个类型别名【注2】。 PF a[5];//跟int* (a[5])(int, char);的效果一样! //首先看到标识符名a,“[]”优先级大于“*”,a与“[5]”先结合。所以a是一个数组,这个数组有5个元素,每一个元素都是一个指针。
void (b[10])(void ()()); typedef void (*pfv)(); typedef void (*pf_taking_pfv)(pfv); pf_taking_pfv b[10]; //跟void (b[10]) (void ()());的效果一样! //b是一个数组,这个数组有10个元素,每一个元素都是一个指针,指针指向一个函数,函数参数是“void (*)()”,返回值是“void”。完毕! //这个参数又是一个指针,指向一个函数,函数参数为空,返回值是“void”。
typedef struct name_t int x; int y; name_s,*name_fp; //name_s结构体类型,name_fp结构体指针类型
typedef基本语法
a. 定义类型别名的方法
使用typedef关键字定义类型别名的一般语法如下:
typedef 原类型 别名;
例如,为int类型定义一个integer别名:typedef int integer;
现在,可以使用integer作为int类型的别名:
integer a = 10; integer b = 20; integer sum = a + b;
b. 定义结构体和联合体的别名
使用typedef关键字为结构体和联合体定义别名:
typedef struct int x; int y; Point; typedef union int i; float f; Number;
现在,可以使用Point和Number作为结构体和联合体的别名:
Point p1 = 1, 2; Number num; num.i = 42;
c. 定义数组和函数指针的别名
使用typedef关键字为数组和函数指针定义别名:
// 为整数数组类型定义别名 typedef int int_array[10]; // 为函数指针类型定义别名 typedef int (*add_function)(int, int);
现在,可以使用int_array和add_function作为数组和函数指针的别名:
int_array arr = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10; int add(int a, int b) return a + b; add_function add_func = add; int result = add_func(5, 7);
typedef在实际开发中的应用
a. 提高代码可读性
通过为复杂类型定义类型别名,可以使代码更加简洁和易读。例如,在处理复杂的嵌套结构体时,使用类型别名可以简化代码:
typedef struct int x; int y; Point; typedef struct Point topLeft; Point bottomRight; Rectangle;
b. 提高代码可维护性
使用类型别名可以更容易地修改底层类型,从而提高代码可维护性。例如,如果需要将项目中的整数类型从int更改为long,只需修改类型别名的定义:
typedef long integer;
现在,所有使用integer别名的地方都将自动使用long类型。
c. 支持跨平台开发
在跨平台开发中,使用类型别名可以帮助解决不同平台上类型大小可能不同的问题。例如,在32位和64位平台上,指针类型的大小可能不同。使用类型别名可以简化跨平台开发:
#ifdef _WIN64 typedef __int64 ssize_t; #else typedef int ssize_t; #endif
d. 简化复杂类型的声明
使用typedef关键字可以简化复杂类型的声明,例如函数指针类型:
typedef int (*compare_function)(int, int);
现在,可以使用compare_function作为函数指针的别名,简化函数指针的声明和使用:
int compare_ints(int a, int b) return a - b; compare_function cmp_func = compare_ints; int result = cmp_func(5, 3);
typedef在C++中的替代方案:using关键字
在C++11及以后的版本中,引入了using关键字作为typedef的替代方案,以更简洁、灵活的方式定义类型别名。
a. 使用using定义类型别名
使用using关键字定义类型别名的语法如下:
using 别名 = 原类型;
例如,为int类型定义一个integer别名:using integer = int;
现在可以使用integer作为int类型的别名:
integer a = 10; integer b = 20; integer sum = a + b;
b. 使用using定义模板类型别名
使用using关键字可以为模板类型定义别名,这是typedef无法做到的:
template<typename T> using Vec = std::vector<T>; Vec<int> vec_int; Vec<double> vec_double;
在这个例子中,为std::vector模板类型定义了一个Vec别名,使得声明模板实例更加简洁。
c. typedef与using的对比
语法简洁性:使用using关键字定义类型别名时,语法更加简洁明了,易于理解。
模板类型别名支持:using关键字支持模板类型别名,这是typedef无法实现的。
兼容性:虽然using关键字在C++11及以后的版本中提供了更好的类型别名支持,但是在旧版本的C++或C语言中,仍需要使用typedef关键字定义类型别名。
总的来说,对于C++11及以后的版本,推荐使用using关键字定义类型别名。它提供了更简洁的语法和模板类型别名支持。然而,在需要考虑向后兼容性的情况下,typedef关键字仍然是一个有效的选择。
注意事项和最佳实践
a. 为类型别名选择有意义的名称
为类型别名选择一个有意义的名称可以提高代码的可读性。尽量避免使用容易引起混淆的名称。例如,为std::vector定义一个类型别名,可以命名为IntVector,而不是简单地命名为IV。
b. 避免过度使用typedef
虽然类型别名可以提高代码的可读性和可维护性,但过度使用typedef可能导致代码变得难以理解。尤其是当多个类型别名嵌套使用时,可能会使代码变得更加复杂。因此,合理使用typedef或using关键字,以确保代码的清晰性和易读性。
c. 在适当的作用域中定义类型别名
为了避免命名冲突和全局污染,建议在适当的作用域中定义类型别名。例如,在类或命名空间内定义类型别名,以限制其作用范围。
d. 使用using替换typedef(C++11及更高版本)
对于C++11及更高版本的项目,推荐使用using关键字替换typedef。using关键字提供了更简洁的语法和模板类型别名支持,使得代码更加易于阅读和维护。
总结
类型别名在C/C++编程中具有重要意义,它可以简化代码、提高代码质量,并支持跨平台开发。通过合理地使用typedef或using关键字,可以提高代码的可读性和可维护性。同时,关注使用类型别名时的注意事项和最佳实践,有助于编写出更加高质量、易于理解的代码。
绿色数据中心节能,值得探究的八大秘密
随着企业信息化建设的迅速发展,数据中心建设越来越重要,将直接影响企业信息系统的建设和应用效果。根据IDC的估算,从运行成本控制的角度看,在IT行业中,能源消耗成本已经达到企业硬件采购成本的25%。而数据却正以52%的复合年均增长率不断攀升。当企业面对不断变化的业务压力,以及呈指数级快速增长的数据时,需要对数据中心环保、节能方面的特性予以足够的考虑和重视。
如何在确保数据高度安全和高度可靠的前提下,最大限度地保证企业在数据中心建设中能够减少浪费和降低无效投入,打造一个真正“绿色节能”的数据中心,提升数字经济效益是当前面临的一个重要课题。绿色数据中心有哪些节能秘密呢?下面就为大家来一一揭秘。
一、利用自然冷却来节能
在数据中心内,为维持恒定的室内温度需要空调制冷系统全年为之降温,由此带来巨额的耗电量和电费。自然界存在丰富的冷源,如果能够很好的利用室外大自然冷源来进行制冷,就能够大幅降低能耗,也是数据中心节能的一个重点。
数据中心利用自然冷源进行制冷的解决方案主要有间接自然冷却和直接自然冷却两种方式:
间接自然冷却,采用带自然冷却节能模块的风冷式冷水机组。春秋过渡季节和冬季以及气温低的夜晚,当环境温度达到比冷冻水回水温度低两度或以上时,开启自然冷却模块制冷,无压缩机功耗,自然冷却不够的部分,再由压缩制冷接力达到需求冷量。随着室外环境温度降低,自然冷却部分占的比例越来越大,直至达到100%,完全自然冷却制冷,无压缩机功耗。
直接自然冷却,就是直接引入室外新风、配合冷热通道隔离实现机房制冷,针对不同地区的气候条件,新风进入机房前需要经过过滤、加湿、除湿、送回风混合等预处理。
数据中心采用自然冷源系统的节能设计,能够充分的利用环境资源,以实现最大限度的节能。有的位于寒冷地区的数据中心还通过在机房模块一侧安装调节风门,来自动调节从室外进入的空气。如果室外气温低于设定的温度点,调节风门会自动开启,室外空气经过滤后进入冷却系统为机房制冷服务。反过来,如果室外空气高于设定的温度点,调节风门会自动关闭,冷却装置则开始工作。这样可以达到充分节能的目的,特别是在漫长的寒冷冬季中可节约制冷电能最高可至80~90%。
二、空调制冷系统的极致优化
空调制冷系统在数据中心里是耗电大户,约占整个数据中心能耗的30~45%。降低制冷系统的能耗是提高数据中心能源利用效率的最直接和最有效措施。
早期的计算机房多采用风冷直膨式精密空调来保障IT设备的正常运行,这种风冷直膨式精密空调室内机一般部署在机房一侧或两侧,机房内的气流组织方式一般采用两种:送风管道上送风方案和架空地板下送风方案。
风管上送风方式一般在机房上空敷设送风管道,冷空气通过风管下方开设的送风百叶送出,经IT设备升温后负压返回空调机。该方法的优点在于安装快速,建造成本低;缺点是受到各种线缆排布和建筑层高限制,送风管道截面无法做大,送风量无法灵活调节。这种送风方式在低热密度的机房应用较多。
还有一种是地板下送风,这种方式利用空调机将冷空气送至地板下,通过送风地板通孔送出,由IT设备前端进风口吸入。该方法的优点在于机房内各点送风量可以通过送风地板通孔率调整,同时通过合理布置数据中心机房线缆和管道,可以少量敷设在地板下,保证美观。缺点是随着使用需求的增长和调整,地板下敷设的电缆不断增加,导致送风不畅,甚至形成火灾隐患。
传统的风冷系统,每套空调相对独立控制和运行,属于分散式系统,易于形成冗余,可靠性较高,具有安装和维护简单等优点,但也有显著的缺点,比如设备能效比较低,室内外机受到管道距离限制。
绿色的数据中心按照节能理念,对空调制冷系统进一步做了大幅优化,在区域模块内采用行级空调系统(Inrow)和顶置冷却单元(OCU),将空调末端部署位置从远离负荷中心的机房两侧移至靠近IT机柜列间或机柜顶部,形成了靠近负荷中心的集中式制冷方式。
行级空调系统由风机、表冷盘管,水路调节装置、温湿度传感器等组成,设备布置在IT机柜列间。行级空调通过内部风机将封闭通道的热空气输送至表冷盘管,实现冷却降温, IT设备根据自身需求将低温的冷通道空气引入,通过服务器风扇排至封闭的热通道,实现水平方向的空气循环。行级空调系统(Inrow)靠近负荷中心,因输送冷空气至负荷中心的距离减小,设备维持制冷循环所需的能耗会比传统方式降低很多。
顶置冷却单元(OCU)与行级空调系统制冷循环很相似,但顶置冷却单元仅由表冷盘管、水路调节装置、温湿度传感器等组成,设备本身不再配置风机,表冷盘管设置于机柜顶部。IT机柜风扇将排出的热空气聚集到封闭的热通道内,通过热压的作用,热空气自然上升,经过机柜顶部的顶置冷却单元表冷盘管降温后,因热压作用开始下降,并再由IT机柜风扇吸进IT设备降温,实现垂直方向的空气循环。顶置冷却单元(OCU)因其本身没有配置风扇,热压作用维持了空气的自然流动循环,使得空调末端设备的能耗消耗降低,可极致至0。这种冷却技术在数据中心的应用,大大提高了冷却效率,有的数据中心甚至实现了年均PUE在1.4以下。
三、服务器虚拟化和存储高度整合,供电灵活
美国环保署统计,数据中心的总耗电量中50%来自服务器和存储系统,它们自然就成了首要的节电对象。如今的热门趋势就是服务器虚拟化和存储整合,这种有效策略可以节省空间、电力和冷却资源。
服务器虚拟化大大提高了IT资源的利用率和适应力,让IT环境更加适应企业发展的业务需求,增强了数据中心的适应性,简化了管理。与服务器虚拟化一样,存储整合也可以提高能效:将多个不同的存储平台替换成一个单独的存储资源。比如,一个企业拥有四百台存储服务器,分散于企业内部,可以将其存储整合为一个单独的存储区域网络(SAN)或网络附属存储(NAS)系统,通过整合提供了更多的容量和更高的利用率,从而也大大减少了空间、电力和冷却资源的占用。
在这方面,大的数据中心可因需、因地制宜,实现高密度+低成本、快速部署、高度整合、节能低耗的最优结合。
比如国内某大型企业的数据中心,通过实施服务器虚拟化和存储整合技术,用10个最新的存储系统换掉了30个较旧的存储系统,因而获得了以下好处:
四、热回收技术的应用
在新建的数据中心里存在服务器端多余热量重新使用的可能性,很好的利用它还能帮助这些设施提高能源的利用效率。大多数数据中心热通道的温度范围在27-40℃之间,尽管温度相对较低,但是我们可以设法捕捉和重复使用这种热量。 按照最大节能设计的理念,数据中心可以设置热回收机组,把本来需要排放掉的冬季主机房产生的热量,转换为冬季采暖所需要的热量,一部分供数据中心办公区冬季采暖用,其余部分供附近科技园区、住宅楼等的冬季采暖用,使能源的综合利用效率达到最高。
通过采用这种IT能效等级的最高水平,我们可建立一个高扩展、灵活、绿色的具有动态基础设施的数据中心。
五、光导管照明和智能灯控系统的运用
国内某数据中心创新引入光导管照明,通过在建筑内走道区域引入光导管系统,直接将阳光折射入室内,让数据中心内的工作人员直接享受自然光的健康照明,这样可大大减少碳排放,节约能源。
有的数据中心还引入了智能灯控,照明灯具采用分区分散控制的原则, UPS室、电池室、变配电室、机房模块的照明均采用智能照明控制监测系统。机房及其附属空间设计多种照明控制模式,可根据所需要的照度,灵活控制开启灯具的数量,可减少照明用电,同时也减少了灯具产生的热量,降低制冷系统负担。
六、非晶合金变压器与节能
非晶合金是一种集制造节能和应用节能于一身的高科技绿色材料。非晶合金材料的制造采用先进的快速凝固技术,在制造过程中节约能耗80%左右,而且制造过程无污染排放,实现了绿色制造。
数据中心选用非晶合金变压器,可以大幅节能。因为非晶合金变压器与普通变压器相比,它具有非常优异的导磁性能,去磁与被磁化过程极易完成,有利于降低损耗增加有效载荷、提高效率,比硅钢片作铁芯变压器的空载损耗下降约80%,运行过程也可实现节能25%-50%。
七、服务器节能技术的应用
服务器是IDC数据中心三大基础IT部件之一,功耗约占数据中心总能耗的40%~50%,而随着数据中心规模不断扩大,数据中心的电费开销甚至超过IT设备的购买成本。因此,降低服务器的功耗已成为数据中心节能和降低运行成本的重中之重。
服务器的节能技术包括:动态节能、部件休眠、供电关相等。动态节能技术是在智能监测系统状态基础上,对电源、处理器、风扇等组件运行状态进行调整,进而达到节能效果。在满足业务负载基础上,采取高度精准的措施降低功耗是某些品牌高端服务器动态节能的核心优势。
服务器的部件休眠技术包括:CPU C-state休眠、硬盘休眠、电源模块休眠等部件休眠。处理器较长时间处于空闲状态时,会触发进入C1/C3/C6/C7等休眠状态,根据休眠状态的设置,处理器将切断CPU的内部时钟或降低CPU电压来实现节能,单处理器深度休眠后的功耗可降低50%以上。
供电关相是另一项关键的动态节能技术,一些品牌高端服务器的处理器、内存采用多相供电,处理器根据业务负载情况,通过SVID(Serial Voltage ID )控制VRM多相电源的打开和关闭,可以提升5~8%的服务器CPU和内存的供电转换效率。
其他还有一些整机节能技术包括:功耗封顶、高压直流、启动低功耗、智能供电、节能优化设计等节能技术。
服务器的功耗封顶技术,可实现快速、精准的功耗封顶操作,确保在机房供电安全前提下,有效提高机房供电效率,提高机柜设备密度,降低机房维护费用。同时消除异常情况下(例如空调故障、业务量突然增加)出现的散热不足和供电不足等风险,提高业务可靠性。
高压直流供电是服务器供电发展的趋势,通过减少电源转换级数实现供电效率提高15%,同时,可以解决-48V等低压直流供电带来的大电流问题。
启动低功耗技术包括:硬盘错峰上电、刀片错峰上电、CPU关核技术,确保服务器上电过程的功耗低于系统的运行功耗,消除硬盘等组件上电瞬间电流过大带来的供电风险,同时还为用户节省了电费。
有的高端服务器提供智能供电、节能设计方案,通过遍布主要部件的传感器采集实时温度和功耗信息,配合环境温度和业务负载压力,实现风扇节能调速和精确送风。风扇按业务负载提供恰当的冷却风量,同时配合硬件低风阻布局,实现服务器整机功耗最低,噪声最小,避免使用单一的温度调速算法,导致功耗高、噪声大,器件高温而影响业务性能。
还有一些新的液冷服务器设计也非常好,相对于传统服务器利用空气带走机箱内发热元件发出的热量,利用液冷技术可以达到显著地改善服务器节能减排的目的,更好的实现高性能、低功耗、高可靠、低成本的绿色数据中心。
八、机房整体监控系统对节能的意义
从数据中心机房负荷和空调冷量配置来看,机房一般设计为N+X的安全运行模式,但从整个数据中心机房IT设备布局来看,由于机房面积较大及IT负载设备功耗的动态变化,机房发热量变化无规律可循,所有室内风机全速运行,压缩机由每台空调独自按照自己的需求进行控制,此种运行模式从运行费用角度来说是不经济节能的。如果强制空调群中的冗余设备进行关机运行,由于机房气流组织及温度变化规律很难掌握,人为控制空调的开机与关机也很难做到机房安全,因此可能存在局部温度不可控的现象。因此,机房精密空调群控対机房节能起到至关重要的意义。
精密空调通过RS485网络与协议转换器通信,协议转换器通过以太网与管理节点协同工作,这样使不同厂家的精密空调(具有监控功能)能够通过标准协议接口与管理节点进行数据交互。每个服务器机柜内安装两个无线温湿度探头,每排机柜构成一个网络,通过物联网的组网方式形成一个温湿度监控网络,并通过以太网将数据上传至管理节点,形成双层监控网络,在监测到机柜服务器超过某个温度点的时候,开启机房空调,反之关停空调。这种系统的运用,可以实现数据中心的精确节能,同时也确保设备的安全稳定运行。
结语
绿色数据中心是国家倡导的,也是数据中心发展到一定阶段的必然要求。绿色数据中心更是这个时代的呼唤,建设高等级绿色、节能环保的新一代数据中心更是我们IT人不懈的追求和目标。
本文出自 “滴水穿石孙杰” 博客,请务必保留此出处http://xjsunjie.blog.51cto.com/999372/1959697
以上是关于探究C/C++ typedef的秘密的主要内容,如果未能解决你的问题,请参考以下文章
C/C++语言typedef的用法详解以及与define的区别
C/c++:语言中关键字typedef(类型重命名)enum(整型常量值集合,代替#define)的使用
c语言:想问下typedef *char[10] Strings;中的*char[10]表示的是啥类型?