refactor(_list): 元素地址运算去掉 uint64 往返,改用 i8* 指针加法
rawptr 即 i8*,指针加法按 pointee(1 字节) 缩放,与 uint64(ptr)+n 再强转回指针逐字等价。
元素步长仍显式由 __elem_size__ 给出,故不能改成下标访问(list[int](pool,8) / list[str](tp,64) 依赖显式步长)。
承接 0f92426 中遗留的裸指针 uint64 手动计算待重新处理。
This commit is contained in:
1 parent
3c29b9bd13
commit
bb05e112ec
1 file changed
+15
-7
@@ -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]
|
||||
Reference in new issue
Block a user