底层操作

crystal提供了一些底层的操作,用于C绑定。

pointerof

返回一个指向变量或对象变量的指针。

  1. a = 1
  2. ptr = pointerof(a)
  3. ptr.value = 2
  4. a #=> 2
  5. # 操作对象的变量
  6. class Point
  7. def initialize(@x, @y)
  8. end
  9. def x
  10. @x
  11. end
  12. def x_ptr
  13. pointerof(@x)
  14. end
  15. end
  16. point = Point.new 1, 2
  17. ptr = point.x_ptr
  18. ptr.value = 10
  19. point.x #=> 10

因为pointerof使用了指针 ,所以它是不安全的。

sizeof

返回一个Int32类型的指定对象的字节大小。

  1. sizeof(Int32) #=> 4
  2. sizeof(Int64) #=> 8

对于引用类型 ,大小等于指针的大小。

  1. # On a 64 bits machine
  2. sizeof(Pointer(Int32)) #=> 8
  3. sizeof(String) #=> 8

instance_sizeof

返回一个类的实例的大小。

  1. class Point
  2. def initialize(@x, @y)
  3. end
  4. end
  5. Point.new 1, 2
  6. # 2 x Int32 = 2 x 4 = 8
  7. instance_sizeof(Point) #=> 12

结果是12不是8的原因为,编译器总是会包含一个额外的Int32用于记录对象的type ID

声明一个未初始化的变量

crystal允许声明这种变量

  1. x = uninitialized Int32
  2. 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:

  1. 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.