Melbourne Channel
Sanity = nil
а че тут английский язык
kostyaBro
Сколько раз мы ещё ему распишем этот алгоритм?)
Melbourne Channel
Sanity = nil
😐
kostyaBro
Oleg
thanks for the inspiration
Also , I think that its probably possible to look at unsafe and find something interesting. But it’s unsafe :D
Sanity = nil
Sanity = nil
bloated language, what did u expect?
kostyaBro
kostyaBro
Как я писал ему, у тебя есть массивы байт разбросанные по памяти
Melbourne Channel
ok i got the solution. thx all
kostyaBro
Если их надо положить рядышком, их придется переложить
Oleg
Oleg
Те , я могу ошибаться , но вроде бы нет же гарантии , что все данные прям лежат в памяти в одном месте ?
Oleg
А. Блен. Это про Мапу было , когда эвакуация
Oleg
Наврал , признаю
Юра (Юрий Александрович)
converting [][]byte to []byte w/o allocation, just via unsafe cast is impossoble. Because []byte can be allocated only in 1 solid range of memory.
The structure [][]byte may me (and will be) allocated in several ranges of addresses
Юра (Юрий Александрович)
Кіт ✙
Oleg
Юра (Юрий Александрович)
Melbourne Channel
basically writing your own [][]byte format in []byte
Oleg
Melbourne Channel
Oleg
в каком смысле привязать?
Возможно , что я и правда мало юзал ансейф , но
Меняем тип нашего слайса на []byte
И итерируемся по нему заменяя в данных хедера слайсов на уже их данные
Oleg
Хедером слайса я назвал структуру из лена, капа и указателя на данные
kostyaBro
Вопрос в том как это все фактически лежит в памяти
Oleg
Юра (Юрий Александрович)
изменить эти адреса теоретически можно, но куда они будут указывать? От того, что мы просто изменим адреса в системной структуре слайса, сами кусочки памяти, от этого никуда не переедут.
Oleg
kostyaBro
Юра (Юрий Александрович)
kostyaBro
Oleg
я не понимаю :(
Это просто мой креатив. Вероятно , что технически все же влетим в стену.
У нас был слайс слайсов, состоит из хедеров слайсов.
Мы меняем его на слайс , который состоит из указателей на данные этих слайсов. Получаем массив из указателей на данные слайсов , что были ранее
kostyaBro
Oleg
Вот. Ансейф поинтер с указателями на хедера слайсов
Oleg
Заменить его на аналогичный, но с указателями на поинтеры на данные хедеров слайсов
Oleg
В каждом хедере же свой указатель на данные
Oleg
И мы можем его достать
Oleg
Грубо говоря произвести замену *header на *header.data
kostyaBro
Да, но как ты собираешься из этого сделать слайс байт
kostyaBro
Oleg
Ммм, тогда меня сбил коммент коллеги про то , что нет гарантии , что все реально лежит в одном месте. И это тогда не сработает
kostyaBro
Я тоже могу ошибаться)
Попробую на досуге заалоцировать гигабайт
kostyaBro
Есть же ещё куча абстракций, ОС, свап
kostyaBro
Программа думает что ее память подряд, а по факту нет.
Ноооо тут это не должно повлиять
Юра (Юрий Александрович)
Я тоже могу ошибаться)
Попробую на досуге заалоцировать гигабайт
Можно. Аллокация происходит в виртуальном адресном пространстве, и в виртуальном адресном пространстве это будут действительно последовательные 1 Гб данных.
На какие физические адреса это спроецируется, мы не знаем, и никогда не узнаем, потому что вся программа и весь рантайм работают только с виртуальным адресным пространством. С физическим работает только процессор и диспетчер памяти ОС.
Юра (Юрий Александрович)
Но для нашей задачи это ничего не меняет:
слайс байт занимает последовательный отрезок в виртуальном адресном пространстве, слайс слайсов занимает несколько отрезков в виртуальном адресном пространстве, которые могут оказаться несмежными и непоследовательными, и нет способа переноса отрезка с одних адресов ВАП в другие адреса ВАП без их реаллокации.
kostyaBro
Ага, но программа думает что все подряд, и думаю это главное
Юра (Юрий Александрович)
процессор и ОС не позволяют делать "unsafe" операции по пересопоставлению адресов ВАП и ФАП по желанию прикладной программы.
Roman
Доброе утро, если закрыть рутину которая запустила другую рутину, обе рутины будут закрыты?
Илья
нет
Юра (Юрий Александрович)
Roman
спасибо
Кіт ✙
Я люблю сырники
Юра (Юрий Александрович)
Единственный случай, когда рутина закрывается из-за закрытия другой рутины - это когда закрывается рутина, с которой началось выполнение программы. Ее окончание приводит к завершению всех других рутин, независимо от того, кем они были порождены.
Roman
Юра (Юрий Александрович)
Юра (Юрий Александрович)
Но если вы вызовете еще раз main из другой рутины, она не приобретет этих свойств "ведущей" рутины. Хотя это утверждение лучше перепроверить экспериментально.
Юрий
Юра (Юрий Александрович)
А так можно? 0_о
по идее - да. Функция как функция. Ее можно еще раз вызвать из кода. Непонятно только зачем. Но я этого не проверял.
Юра (Юрий Александрович)
Да, завершение "дополнительного" main не приводит к завершению программы.
Пример: https://go.dev/play/p/peMJHO1cjnl
Юра (Юрий Александрович)
Юра (Юрий Александрович)
Вот это точно появляется в логе?
log.Print("cancel use")
Andrey
Юра (Юрий Александрович)
Подождите, а что это такое:
go func() {
<-t.callBackChan[userTGID]
cancel()
log.Print("cancel use")
}()
go new_sub(ctx, t.messageChan[userTGID], update, t, t.callBackChan[userTGID])
Почему асинхронный вызов new_sub и анонимной функции func() происходят так, без внутренней синхронизации и контроля порядка выполнения?
Юра (Юрий Александрович)
Скорее всего у вас cancel выполняется еще до вызова new_sub.
Roman
Roman