如何复制Ruby Fiddle结构体实例?是否有更优方案?
Ruby中复制Fiddle结构体实例的更优方案
原生Fiddle确实没有提供直接复制结构体实例的便捷方法,你当前的方案可行但不够优雅,这里有两种更合适的实现方式:
1. 利用Fiddle::Pointer#copy方法(推荐)
Fiddle::Pointer自带的copy方法是专门用于内存块复制的API,比手动处理字符串更高效直观:
require 'fiddle/import' X = Fiddle::Importer.struct [ 'int a', 'int b', ] x = X.malloc x.a = 1 x.b = 2 x2 = X.malloc x.to_ptr.copy(x2.to_ptr, X.size) # 直接复制整个结构体的内存区域 x2.b = 3 p [x.b, x2.b] # 输出 [2, 3]
2. 手动逐个复制字段(适合字段少的场景)
如果结构体的字段数量不多,直接逐个赋值字段的方式可读性最强,也避免了内存操作的复杂度:
require 'fiddle/import' X = Fiddle::Importer.struct [ 'int a', 'int b', ] x = X.malloc x.a = 1 x.b = 2 x2 = X.malloc x2.a = x.a x2.b = x.b x2.b = 3 p [x.b, x2.b] # 输出 [2, 3]
你之前尝试的x2.to_ptr[]=效果差,是因为该运算符需要严格匹配赋值字符串的字节数与目标内存区域大小,且涉及字符串转换的额外开销,而copy方法是底层直接操作内存,可靠性和效率都更高。
内容的提问来源于stack exchange,提问作者relent95
相关产品推荐
相关产品推荐

