底层操作
crystal提供了一些底层的操作,用于C绑定。
pointerof
返回一个指向变量或对象变量的指针。
a = 1
ptr = pointerof(a)
ptr.value = 2
a #=> 2
# 操作对象的变量
class Point
def initialize(@x, @y)
end
def x
@x
end
def x_ptr
pointerof(@x)
end
end
point = Point.new 1, 2
ptr = point.x_ptr
ptr.value = 10
point.x #=> 10
因为pointerof使用了指针 ,所以它是不安全的。
sizeof
返回一个Int32类型的指定对象的字节大小。
sizeof(Int32) #=> 4
sizeof(Int64) #=> 8
对于引用类型 ,大小等于指针的大小。
# On a 64 bits machine
sizeof(Pointer(Int32)) #=> 8
sizeof(String) #=> 8
instance_sizeof
返回一个类的实例的大小。
class Point
def initialize(@x, @y)
end
end
Point.new 1, 2
# 2 x Int32 = 2 x 4 = 8
instance_sizeof(Point) #=> 12
结果是12不是8的原因为,编译器总是会包含一个额外的Int32用于记录对象的type ID
声明一个未初始化的变量
crystal允许声明这种变量
x = uninitialized Int32
x #=> some random value, garbage, unreliable
This is unsafe code and is almost always used in low-level code for declaring uninitialized StaticArray buffers without a performance penalty:
buffer = uninitialized UInt8[256]
The buffer is allocated on the stack, avoiding a heap allocation.
The type after the uninitialized keyword follows the type grammar.
当前内容版权归 crystal-lang中文站 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 crystal-lang中文站 .