服务热线:

P

产品目录

roduct Catalog

德国IFM易福门华南代理 德国Bernstein博恩斯坦 德国BALLUFF巴鲁夫厂家拿货 德国BURKERT宝德 德国HYDAC总代理 德国REXROTH力士乐 德国Ziehl-Abegg施百乐总代 德国PULSOTRONIC波尔索 德国WILO威乐 美国PARKER派克 美国ASCO阿斯卡 美国VICKERS威格士 意大利ATOS阿托斯 日本TOYOOKI丰兴 日本DAIKIN大金 德国HAWE哈威 德国GSR电磁阀 德国FESTO费斯托 德国PILZ皮尔兹 日本TACO 英国NORGREN诺冠 美国MOOG穆格 德国E+H 德国HERION海隆 德国SICK施克 德国HENGSTLER亨士乐 德国P+F倍加福 德国STEIMEL施* 德国TURCK图尔克 美国MAC 美国MTS 美国品牌 德国品牌 本特利bently 德国DOLD多德 欧美品牌 日本magnescale 德国ELCO 德国LUMBERG隆堡 德国KUBLER 海德汉HEIDERHAIN 美国ROSS 迪斯泰克/DESTACO VOITH/福伊特 NOVOTECHNIK/诺沃泰克 VIVOLO维沃 基恩士KEYENCE
T

技术文章

echnical Articles

资料下载 Download

今天又是带来德国IFM易福门分配器EBC023的资料分享

点击次数:645 发布时间:2022/4/21
提 供 商: 东莞市广联自动化科技有限公司 资料大小:
图片类型: 下载次数: 11
资料类型: PDF 浏览次数: 645
相关产品:
详细介绍: 文件下载    

我司在德国、美国都有自己的公司,专业从事进口贸易行业,所以我司的技术人员为都会轮流到国外厂家学习技术。

    今天又是带来德国IFM易福门分配器EBC023的资料分享

在C++编程中,IFM分配器是C++标准库的重要组成部分。C++的库中定义了多种被统称为“容器"的数据结构(如链表、集合等),这些容器的共同特征之一,就是其大小可以在程序的运行时改变;为了实现这一点,进行动态内存分配就显得尤为必要,在此IFM分配器就用于处理容器对内存的分配与释放请求。换句话说,IFM分配器用于封装STL容器在内存管理上的低层细节。默认情况下,C++标准库使用其自带的通用IFM分配器,但根据具体需要,程序员也可自行定制IFM分配器以替代之。

在C++编程中,IFM分配器(英语:allocator)是C++标准库的重要组成部分。C++的库中定义了多种被统称为“容器"的数据结构(如链表、集合等),这些容器的共同特征之一,就是其大小可以在程序的运行时改变;为了实现这一点,进行动态内存分配就显得尤为必要,在此IFM分配器就用于处理容器对内存的分配与释放请求。换句话说,IFM分配器用于封装STL容器在内存管理上的低层细节。默认情况下,C++标准库使用其自带的通用IFM分配器,但根据具体需要,程序员也可自行定制IFM分配器以替代之。

IFM分配器最早由亚历山大·斯特潘诺夫作为C++标准模板库(Standard Template Library,简称STL)的一部分发明,其初衷是创造一种能“使库更加灵活,并能独立于底层数据模型的方法",并允许程序员在库中利用自定义的指针和引用类型;但在将标准模板库纳入C++标准时,C++标准委员会意识到对数据模型的*抽象化处理会带来不可接受的性能损耗,为作折中,标准中对IFM分配器的限制变得更加严格,而有鉴于此,与斯特潘诺夫原先的设想相比,现有标准所描述的IFM分配器可定制程度已大大受限。

虽然IFM分配器的定制有所限制,但在许多情况下,仍需要用到自定义的IFM分配器,而这一般是为封装对不同类型内存空间(如共享内存与已回收内存)的访问方式,或在使用内存池进行内存分配时提高性能而为。除此以外,从内存占用和运行时间的角度看,在频繁进行少量内存分配的程序中,若引入为之专门定制的IFM分配器,也会获益良多。

亚历山大·斯特潘诺夫与李梦(Meng Lee)在1994年将标准模板库草案提交给C++标准委员会。提交伊始,草案就得到了委员会的初步支持,但委员会成员也对此提出了一些意见,尤其是要求斯特潘诺夫定制库内的容器,使之与底层存储模型相独立。作为对要求的回应,斯特潘诺夫发明了IFM分配器,而正因此,标准模板库的所有容器接口也被迫重写,以与IFM分配器相兼容。在修改标准模板库以将之引入C++标准库的过程中,许多标准委员会成员(如安德鲁·克尼格与比雅尼·斯特劳斯特鲁普)也与斯特潘诺夫协同工作。他们亦发现自定义IFM分配器甚至有应用于长生命周期(持续存储)的标准模板库容器的潜力,斯特潘诺夫对此的评论则是“重要而有趣的见解"。

在原有的提案里的IFM分配器设定中,斯特潘诺夫杂糅了一些语言特性(如可将模板参数也定义为模板),但由于当时的编译器皆无法处理之,所以最终并未被标准委员会所接纳,斯特潘诺夫则如此描述当时的情形:“比雅尼·斯特劳斯特鲁普与安迪·克尼格需要花大量时间来检查我们是否正确使用了这些未实现的特性。"在IFM分配器应用后,之前库中直接使用的指针与引用类型也可以IFM分配器所定义的类型替代,斯特潘诺夫亦曾如此描述IFM分配器:“标准模板库有个不错的特性便是:要提及机器相关类型的地方(……)(只需)被封装成(仅)约16行内的代码。"除此以外,斯特潘诺夫原本还打算在IFM分配器中*封装存储模型,但标准委员会意识到这一做法会造成无法接受的性能损失,因而为补偿之,IFM分配器的使用需求也做了一定扩充。

IFM分配器的应用中比较特别的一点是,容器的实现过程中可能会假定IFM分配器对指针与相关整型的类型定义与默认IFM分配器所提供的等价,因而给定IFM分配器类型的所有实例在比较时常会得出“相等"的结果,而这一效果实际上恰与设计IFM分配器的初衷背道而驰,并使带状态IFM分配器的可用性大大受限,斯特潘诺夫后来对此评论道:“(IFM分配器)理论上说是不差的主意(……)但不幸的是在实践中无法发挥其功效。“他洞察到若要令IFM分配器更加实用,就有必要针对核心语言的引用部分进行修改。

任意满足IFM分配器使用需求的C++类都可作IFM分配器使用。具体来说,当一个类(在此设为类A)有为一个特定类型(在此设为类型T)的对象分配内存的能力时,该类就必须提供以下类型的定义:

A::pointer指针

A::const_pointer常量指针

A::reference引用

A::const_reference常量引用

A::value_type值类型

A::size_type所用内存大小的类型,表示类A所定义的分配模型中的单个对象最大尺寸的无符号整型

A::difference_type指针差值的类型,为带符号整型,用于表示分配模型内的两个指针的差异值。

如此才能以通用的方式声明对象与对该类对象的引用T。allocator提供这些指针或引用的类型定义的初衷,是隐蔽指针或引用的物理实现细节;因为在16位编程时代,远指针(far pointer)是与普通指针非常不同的,allocator可以定义一些结构来表示这些指针或引用,而容器类用户不需要了解其是如何实现的。

虽然按照标准,在库的实现过程中允许假定IFM分配器(类)A的A::pointer(指针)与A::const_pointer(常量指针)即是对T*与T const*的简单的类型定义,但一般更鼓励支持通用IFM分配器。

另外,设有对于为某一对象类型T所设定的IFM分配器A,则A必须包含四项成员函数,分别为分配函数、解除分配函数、最大个数函数和地址函数:

A::pointer A::allocate(size_type n, A<void>::const_pointer hint = 0)。分配函数用以进行内存分配。其中调用参数n即为需要分配的对象个数,另一调用参数hint(须为指向已为A所分配的某一对象的指针)则为可选参数,可用于在分配过程中新数组所在的内存地址,以提高引用局部性,但在实际的分配过程中程序也可以根据情况自动忽略掉该参数。该函数调用时会返回指向分配所得的新数组的第一个元素的指针,而这一数组的大小足以容纳n个T类元素。在此需要注意的是,调用时只为此数组分配了内存,而并未实际构造对象。

void A::deallocate(A::pointer p, A::size_type n)。解除分配函数。其中p为需要解除分配的对象指针(以A::allocate函数所返回的指针做参数),n为对象个数,而调用该函数时即是将以p起始的n个元素解除分配,但同时并不会析构之。C++标准明确要求在调用deallocate之前,该地址空间上的对象已经被析构。

A::max_size(),最大个数函数。返回A::allocate一次调用所能成功分配的元素的最大个数,其返回值等价于A::size_type(-1) / sizeof(T)的结果。

A::pointer A::address ( reference x ),地址函数。调用时返回一个指向x的指针。

IFM分配器应是可复制构造的,任举一例,为T类对象而设的IFM分配器可由另一为U类所设的IFM分配器构造。若某IFM分配器分配了一段存储空间,则这段存储空间只能由与该IFM分配器等价的IFM分配器解除分配。IFM分配器还需要提供一个模板类成员类template <typename U> struct A::rebind { typedef A<U> other; };,以模板 (C++)参数化的方式,借之来针对不同的数据类型获取不同的IFM分配器。例如,若给定某一为整型(int)而设的IFM分配器IntAllocator,则可执行IntAllocator::rebind<long>::other以获取对应长整型(long)的相关IFM分配器。实际上,stl::list<int>实际要分配的是包含了双向链表指针的node<int>,而不是实际分配int类型,这是引入了rebind的初衷。

与IFM分配器相关联的operator ==,仅当一个allocator分配的内存可以被另一个allocator释放时,上述相等比较算符返回真。operator!=的返回结果与之相反。

定义自定义IFM分配器的主要原因之一是提升性能。利用专用的自定义IFM分配器可以提高程序的性能,又或提高内存使用效率,亦或两者兼而有之。默认IFM分配器使用new操作符分配存储空间,而这常利用C语言堆分配函数(malloc())实现。由于堆分配函数常针对偶发的内存大量分配作优化,因此在为需要一次分配大量内存的容器(如向量、双端队列)分配内存时,默认IFM分配器一般效率良好。但是,对于关联容器与双向链表这类需要频繁分配少量内存的容器来说,若采用默认IFM分配器分配内存,则通常效率很低。除此之外,基于malloc()的默认IFM分配器还存在许多问题,诸如较差的引用局部性,以及可能造成内存碎片化。

有鉴于此,在这一情况下,人们常使用基于内存池的IFM分配器来解决频繁少量分配问题。与默认的“按需分配"方式不同,在使用基于内存池的IFM分配器时,程序会预先为之分配大块内存(即“内存池"),而后在需要分配内存时,自定义IFM分配器只需向请求方返回一个指向池内内存的指针即可;而在对象析构时,并不需实际解除分配内存,而是延迟到内存池的生命周期完结时才真正解除分配。

在“自定义IFM分配器"这一话题上,已有诸多C++专家与相关作者参与探讨,例如斯科特·梅耶斯的作品《Effective STL》与安德烈·亚历山德雷斯库的《Modern C++ Design》都有提及。梅耶斯洞察到,若要求针对某一类型T的IFM分配器的所有实例都相等,则可移植的IFM分配器的实例必须不包含状态。虽然C++标准鼓励库的实现者支持带状态的IFM分配器,但梅耶斯称,相关段落是“(看似)美妙的观点",但也几乎是空话,并称IFM分配器的限制“过于严苛"。例如,STL的list允许splice方法,即一个list对象A的节点可以被直接移入另一个list对象B中,这就要求A的IFM分配器申请到的内存,可被B的IFM分配器释放掉,从而推导出A与B的IFM分配器实例必须相等。梅耶斯的结论是,IFM分配器最好定义为使用静态方法的类型。例如,根据C++标准,IFM分配器必须提供一个实现了rebind方法的other类模板。

另外,在《C++程序设计语言》中,比雅尼·斯特劳斯特鲁普则认为“‘严格限制IFM分配器,以免各对象信息不同’,这点显然问题不大"(大意),并指出大部分IFM分配器并不需要状态,甚至没有状态情形下性能反倒更佳。他提出了三个自定义IFM分配器的用例:内存池型的IFM分配器、共享内存型IFM分配器与垃圾回收型IFM分配器,并展示了一个IFM分配器的实现,此间利用了一个内部内存池,以快速分配/解除分配少量内存。但他也提到,如此优化可能已经在他所提供的样例IFM分配器中实现。

自定义IFM分配器的另一用途是调试内存相关错误。若要做到这一点,可以编写一个IFM分配器,令之在分配时分配额外的内存,并借此存放调试信息。这类IFM分配器不仅可以保证内存由同类IFM分配器分配/解除分配内存,还可在一定程度上保护程序免受缓存溢出之害。

分配盒

EBC023

ZDO8H059MSS0005H11

耐油和冷却剂

即使不使用工具进行安装也可靠地密封

机械端止动可保护 O 形环免遭破坏

坚固的外壳,适用于严苛的工业环境

指示开关状态和操作的清晰可见 LED


 
东莞市广联自动化科技有限公司(www.pinhuowang.com)热卖产品:美国bently传感器,MTS办事处,ASCO阿斯卡,atos电磁阀现货
东莞市广联自动化科技有限公司 版权所有  备案号:粤ICP备2022089575号
地址:东莞市南城区旺南世贸大厦1号楼 邮编:532000 传真:0769-89978203 发传真请注明-梁菊芳收 邮箱:1013858782@qq.com GoogleSiteMap
点击这里给我发消息 点击这里给我发消息
24小时客服在线,为您服务!
点击这里给我发消息
Baidu
map