живи - век учись).
using Base.Libc: malloc, free
using BenchmarkTools
import Base: setindex!, getindex, iterate
struct MyVector{T}
ptr::Ptr{T}
sz::Int
end
function MyVector{T}(sz) where T
ptr = convert(Ptr{T}, malloc(sz * sizeof(T)))
return MyVector{T}(ptr, sz)
end
function setindex!(vec::MyVector, x, i)
unsafe_store!(vec.ptr, x, i)
end
function getindex(vec::MyVector, i)
unsafe_load(vec.ptr, i)
end
iterate(vec::MyVector, i = 1) = i > vec.sz ? nothing : (vec[i], i + 1)
и тогда можно использовать его как (почти) обычный вектор:
function f()
vec = MyVector{Int}(10)
for i in 1:vec.sz
vec[i] = i
end
res = sum(vec)
free(vec.ptr)
return res
end
julia> @btime f()
13.469 ns (0 allocations: 0 bytes)
При этом
function g()
vec = Vector{Int}(undef, 10)
@inbounds for i in 1:length(vec)
vec[i] = i
end
res = sum(vec)
return res
end
julia> @btime g()
41.368 ns (1 allocation: 144 bytes)
может уже есть "язык", где можно было-б в скиптовом режиме на C++ писать сразу, и он на лету компилировался через LLMV?
когда в коде вижу malloc, я хватаюсь за свой Access Violation
По этому поводу есть хорошая статья, рекомендую почитать https://www.rfleury.com/p/untangling-lifetimes-the-arena-allocator
в плюсах есть умные указатели, которые в принципе тот же gc, только без gc
Решил с этим поэкспериментировать, но результат у меня получается, почему-то, прямо противоположный - с malloc-free считает вдвое дольше. Правда, у меня Windows Кстати, наследовать от AbstractVector тоже, оказывается, нельзя
calloc(sz, sizeof(T))
Обсуждают сегодня