169 похожих чатов

Пока с бампером игрался, выяснил интересную штуку (как говорится, век

живи - век учись).

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)

8 ответов

60 просмотров

может уже есть "язык", где можно было-б в скиптовом режиме на C++ писать сразу, и он на лету компилировался через LLMV?

когда в коде вижу malloc, я хватаюсь за свой Access Violation

Ο Είρωνας-🤍💙🤍 Автор вопроса
Alex
когда в коде вижу malloc, я хватаюсь за свой Acces...

По этому поводу есть хорошая статья, рекомендую почитать https://www.rfleury.com/p/untangling-lifetimes-the-arena-allocator

Ο Είρωνας 🤍💙🤍
По этому поводу есть хорошая статья, рекомендую по...

в плюсах есть умные указатели, которые в принципе тот же gc, только без gc

Решил с этим поэкспериментировать, но результат у меня получается, почему-то, прямо противоположный - с malloc-free считает вдвое дольше. Правда, у меня Windows Кстати, наследовать от AbstractVector тоже, оказывается, нельзя

Похожие вопросы

Обсуждают сегодня

@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
Подобного рода ;Следующие три строки это директивы ассемблера, ;которые можно не задавать, т.к.работаем в Visual Studio. ;Символ ";" - это начало однострочного комментария ...
Егор Анелькин
3
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
Подскажите, где смотреть результат выполнения программы? Код: ;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, станда...
Егор Анелькин
5
еще вопрос, допустим мы создадим char массив из 10 элементов и присвоим ему через сканф 10 символов. и выведем все символы. Хотел спросить последний элемент /0 будет включать...
Anthem
11
открыть папку в проводнике: 1 - ShellExecute 2 - ExecuteProcess 3 - OpenDocument что лучше выбрать?
Alexey Kulakov
12
Где в Астане можно купить мясо для шашлыков?
Dancing Іңұқәһүғө
21
;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, стандартный ;вызов процедуры ;option casemap:no...
Егор Анелькин
1
Карта сайта