Effective Erlang —— 二进制型的构造和匹配

在 R12B 中,构造和匹配二进制型最自然的方式比前版中的要快得多。你可用如下简单的代码来构造一个二进制型:

这么写(在 R12B 中)/求别这么写(在 R12B 之前的版本中)

my_list_to_binary(List) -> my_list_to_binary(List, <<>>).
my_list_to_binary([H|T], Acc) -> my_list_to_binary(T, <<Acc/binary,H>>);
my_list_to_binary([], Acc) -> Acc.

在 R12B 之前的发行版中,在每次迭代中 Acc 都会被复制一次。在 R12B 中,Acc 只在第一次迭代中被复制,并且在此之后,会开辟额外的内存空间。在下一轮迭代中,H 被写入额外的内存。当额外的内存用满时,该二进制型会重新扩展更多的额外内存。被扩展的内存是二进制型的两倍大小,或者是256,无论哪个都比二进制型大。

匹配二进制型最自然的方式现在是最快的。

这么写(在 R12B 中)

my_binary_to_list(<<H,T/binary>>) -> [H|my_binary_to_list(T)];
my_binary_to_list(<<>>) -> [].
时间: 2024-10-24 02:12:20

Effective Erlang —— 二进制型的构造和匹配的相关文章

Erlang二进制模式匹配

Erlang的模式匹配用来处理二进制数据可谓是得心应手.不仅直观,而且超乎想象的简单.在C++中,处理二进制数据首先要管理缓冲区.然后再按字节进行操作,如果要处理的数据不是按字节对齐,则需要进行位移等操作.操作过程复杂又难懂,如果再没有注释,那对于维护这段代码的人来说简直就是噩梦.例如:操作一串保存了RGB颜色值序列的二进制串,在C++中要这样操作: struct RGB { char R; char G; char B; }; vector<RGB> rgbVector; for(int i

[原创]erlang二进制语法点滴

Erlang/OTP 17 [erts-6.0] [source] [smp:2:2] [async-threads:10] [kernel-poll:false]Eshell V6.0  (abort with ^G)1> <<100,200,300,400>>.<<100,200,44,144>>2> <<100,200,300:16,400:16>>.<<100,200,1,44,1,144>>

erlang二进制数据垃圾回收机制

erlang二进制数据在内存中有两种存在形式,当数据大小不到 64 bytes,就直接存在进程堆内.假设超过了64 bytes.就被保存到进程外的共享堆里,能够给节点内全部进程共享. erlang有两种二进制容器:heap binaries和refc binaries. heap binaries Heap binaries are small binaries, up to 64 bytes, that are stored directly on the process heap. They

【题解】CF739D Recover a functional graph(构造+二分图匹配)

[题解]CF739D Recover a functional graph(构造+二分图匹配) 题目大意 一个图被称为F图当且仅当每个点出度为1.可以发现这个图是一个内向基环森林,给出所有点到它能到达的环(只会有一个)的距离dis和那个环的长度len,然而有些点的信息模糊了,用?代替,可以是任何数.现在你要输出一个合法的构造方案. 可以提炼出一个图是F图的条件: 对应环的距离数组是自然数数列 \(len=k\)的点的个数是\(tk,t\in N^+\) 由于第二个条件只能用问号补,没有决策需要做

从二进制数据流中构造GDAL能够读取的图像数据

在非常多时候.我们的图像数据往往都不是文件方式存储在磁盘上.而是可能从网络或者数据库中获取的是二进制的图像数据流.最简单的方式和最easy想到的方式就是将这个文件流保存到磁盘上形成一个文件,然后再使用GDAL来打开进行处理. 可是这样有一个不太好的地方就是须要生成一个磁盘的暂时文件.并且在磁盘上折腾了一圈后会添加不必要的系统开销. 针对这个文件.GDAL库里面已经有现成的API来进行处理.以下就使用一个简单的样例来进行说明,代码例如以下: GByte *GetStream(const char*

Effective C++ .09 不在构造和析构过程中调用virtual函数

看过C++对象模型的话就可以知道,在构造基类时,完整的vtable没有建立起来(表项没有被相应的子类函数替换),因而无法调用到子类的函数(即构造函数中的virtual函数是本类里的方法,不是virtual的).书中也说即使调用了,因为构造函数的调用顺序,父类在构造时子类的成员还没有初始化可能,此时调用virtual函数无疑会造成混乱. 类似的关于析构过程,是一个子类先执行然后再父类执行的过程,如果在父类中调用virtual函数那么可能涉及到的子类数据已经被释放或者重置了,应该是出于这个考虑吧.

BZOJ 3107 CQOI2013 二进制a+b 构造

题目大意:给定n位二进制数a,b,c,要求重组三个数的各个位,使得a′+b′=c′且最小化c′ 一个构造题咋这么多人写DP-- 不考虑位数限制,显然答案只与三个数中1的个数有关 令x=cnta,y=cntb,z=cntc,其中cntx代表x中1的个数 不妨令x≥y 以下用x=10,y=5来举例 若z=1,构造方式如下: 000001111111111 011110000000001 100000000000000 证明:显然最低位肯定是1+1=10,然后再往上肯定都是单个1,构造方式唯一 若1<

Erlang 位串和二进制数据

http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=25876834&id=3300393 因为在本人工作中,服务端Erlang和客户端的flash通信都是发送二进制数据(协议)来通信,Erlang处理起来二进制数据真的很方便,在空余时间查看和翻译了Erlang的二进制相关一些说明文档,当然里面也有根据自己的经验和知识理解的地方. 在二进制解析部分,其实还有很多好的例子.还有就是Erlang的二进制实际应用的例子,下次会再分享的,

Erlang 摘要

世界是并行的,Erlang程序反应了我们思考和交流的方式,人作为个体通过发送消息进行交流,如果有人死亡,其他人会注意到.Erlang里的模块类相当于OOPL中的类,进程相当于OOPL里的对象或类实例.并发编程可以用来提升性能,创建可扩展和容错的系统,以及编写清晰和可理解的程序来控制现实世界里的应用. 并发程序是以一种并发编程语言编写的程序,并发编程语言拥有用于编写并发程序的语言结构.Erlang的并发程序是由互相通信的多组顺序进程组成,一个进程就是一个轻量级的虚拟机,可以执行单个的Erlang函