diff --git a/_list.vp b/_list.vp index ff5e35d..6aae831 100644 --- a/_list.vp +++ b/_list.vp @@ -50,29 +50,37 @@ class list[T]: string.memcpy(new_data, self.__data__, self.__count__ * self.__elem_size__) self.__data__ = new_data self.__capacity__ = new_cap - elem_ptr: T* = T*(uint64(self.__data__) + self.__count__ * self.__elem_size__) + # 元素地址:`T*(self.__data__ + i * elem_size)`。 + # · rawptr 就是 i8*,i8* 上的 `+` 按 **1 字节**缩放(ExprGenOps 的指针算术分流 + # → ExprGenBase.translate_ptr_arith 按 pointee 大小缩放)⇒ 与原先 + # `uint64(ptr) + n` 再强转回指针**逐字等价**,故去掉整数往返。 + # · 步长仍由 __elem_size__ **显式**给出,不能改成下标访问(`__data__[i]` 会按 + # sizeof(T) 缩放):list[int](pool, 8) / list[str](pool, 64) 这类"按显式步长 + # 当字节缓冲"的用法依赖它。 + # 下面 get/set/__getitem__/__setitem__/pop/__next__ 同此式,不再重复注释。 + elem_ptr: T* = T*(self.__data__ + self.__count__ * self.__elem_size__) elem_ptr[0] = item self.__count__ += 1 def get(self, index: sizet) -> T: - elem_ptr: T* = T*(uint64(self.__data__) + index * self.__elem_size__) + elem_ptr: T* = T*(self.__data__ + index * self.__elem_size__) return elem_ptr[0] def __getitem__(self, index: sizet) -> T: - elem_ptr: T* = T*(uint64(self.__data__) + index * self.__elem_size__) + elem_ptr: T* = T*(self.__data__ + index * self.__elem_size__) return elem_ptr[0] def set(self, index: sizet, value: T): - elem_ptr: T* = T*(uint64(self.__data__) + index * self.__elem_size__) + elem_ptr: T* = T*(self.__data__ + index * self.__elem_size__) elem_ptr[0] = value def __setitem__(self, index: sizet, value: T): - elem_ptr: T* = T*(uint64(self.__data__) + index * self.__elem_size__) + elem_ptr: T* = T*(self.__data__ + index * self.__elem_size__) elem_ptr[0] = value def pop(self) -> T: self.__count__ -= 1 - elem_ptr: T* = T*(uint64(self.__data__) + self.__count__ * self.__elem_size__) + elem_ptr: T* = T*(self.__data__ + self.__count__ * self.__elem_size__) return elem_ptr[0] def clear(self): @@ -87,5 +95,5 @@ class list[T]: raise StopIteration idx: sizet = self.__iter_index__ self.__iter_index__ = idx + 1 - elem_ptr: T* = T*(uint64(self.__data__) + idx * self.__elem_size__) + elem_ptr: T* = T*(self.__data__ + idx * self.__elem_size__) return elem_ptr[0]