Pull to refresh
94
0
Новожилов Александр @mrlolthe1st

Системный и прикладной программист

Send message

Я попробую в будущих версиях это каким-то образом победить и улучшить, но пока что как есть. Разрешить бы заменять значения референсов - было бы уже куда лучше. Но это не избавило бы от проблемы хранить объекты с этими референсами в памяти.

Так я всё равно не понял, почему нельзя использовать System V очереди? https://www.softprayog.in/programming/interprocess-communication-using-system-v-message-queues-in-linux

Будет что-то такое:

class package : public can_be_shared {
	char* topic_;
	char* payload_;
public:
	inline static void init_view(char& c, std::size_t idx, const char* place) {
		c = place[idx];
	}

	package(std::string_view topic, std::string_view payload) :
		can_be_shared({
			array(&topic_, topic.size() + 1, init_view, topic.data()),
			array(&payload_, payload.size() + 1, init_view, payload.data())
			}) {}
  
	package(void* ptr) : from_existing(ptr),
		can_be_shared({ existing_array(&topic_), existing_array(&payload_) }) {}

	std::string_view topic() const { return topic_; }
	std::string_view payload() const { return payload_; }

};

boost явно тяжелее, чем файл в 300 строк.

Нет, не файловая, я же писал, что используется System V shared-сегменты. Во-первых, достаточно одной инициализации во время запуска. (Те создать объекты всех нужных мне таблиц можно перед началом выполнения кода). Во-вторых, копировать объекты запрещено (зачем их копировать, зачем вам вообще в рамках одного процесса несколько объектов, указывающих на одну таблицу, если можно передавать по ссылке уже существующие?) Так что потратить один раз несколько десятков миллисекунд на инициализацию объекта не так страшно, ведь потом не надо делать никаких вычислений над указателями.
Так что не вижу тут никакого оверхеда. https://pastebin.com/ZjyRxRsJ

Передавать объекты другому процессу можно через System V очереди, зачем для этого использовать shared-память? Она используется для хранения структур данных в памяти.

Во-первых, я нигде не гарантирую, что STL-структуры можно сохранять: написано же: фундаментальные типы и функции, помеченные can_be_shared. Тот вектор, который лежит в can_be_shared нужен чтобы мы могли управлять тем, куда указывают указатели полей. Он нигде не сохраняется, он нужен в рантайме.

Цель вовсе в другом. Копировать данные через shared-память можно и при помощи очередей (из того же System V) и как их сериализовать - уже другая проблема. Там в тегах указано NoSQL. Например, эта библиотека лично мне нужна для того, чтобы переписать уже существующую NoSQL БД (которая должна работать достаточно быстро -> даже скорости просто mmap'нутого файла не достаточно) более простым способом. Там надо хранить колонки, индексы, значения. И это куда более трудоёмкая задача нежели сохранение объектов на стеке.

Кстати, я не писал цель создания этих стеков -- это были синтетические примеры (некоторая часть задачи из реальной жизни). Почему Вы вдруг решили, что я хочу передавать объекты другому процессу?

Смысл библиотеки в том, чтобы удобно описывать и взаимодействовать со структурами. Память выделяет аллокатор, который вы передали в .make_shared(), синхронизировать доступ тоже надо извне. Потому, что каждому разработчику для каждого типа данных нужны свои гарантии. Может, не всегда надо блокировать всю структуру и прочее.

Константная ссылка - ок.

По поводу того, что не надо два раза писать конструктор - у меня пока нет идей как сделать это удобнее, чем есть сейчас.

Нет, аллокатора нет - каждый может написать его по-своему, используя какие ему нужно библиотеки и функции (можно создавать System V-сегменты, можно mmap'ить файл в память - и тд и тп) - моя библиотека всего лишь его вызовет. Пример аллокатора был приведен в статье.

  1. Тут описался, тут не должен быть вызван этот конструктор.

  2. Чтобы можно было делать так: many_stacks x({3, 4, 5}). Можно сделать передачу по ссылке - но тогда уже так удобно нельзя будет написать.

  3. Покурил доки - переделаю на uintptr_t.

  4. Такие касты позволяют мне получить именно то, что я хочу. Именно просто указатель, только другого типа

  5. Васе Пупкину поможет IDE, которая подскажет, что какое-то поле не инициализировано.

  6. Вот тут неправда. В функцию make_shared передаётся аллокатор, который и должен выделять эту shared-память.

А я вот писал (еще два года назад) NoSQL БД для работы (нужен доступ из нескольких процессов + обновление), решил тут переделать почти весь бэкенд с PHP на CPP - а, значит, и заменить БД (тк та реализация была написана для использования из-под PHP) - решил сделать такую вот удобную (по моему мнению) библиотеку - чтобы и себе удобно было, и кому-то еще пригодилось. Так что если будут какие-то вопросы - можете написать, уже есть опыт в подобных штуках :)

Ну, вопросы это хорошо, но только не по огромному кол-ву теории по языку, лучше дать задачу по типу Knight's Dial, ведь большая часть вопросов выше не дает гарантии на то, что вы сумеете решать задачи, а не собирать решение из коструктора лего. Дали бы ДО по Декартачам, что-нибудь аккуратно закодить — и уже ясно, что такой человек нуден компании, а вот человек который не имеет представление о всем этом, а только собирает из лего — бесполезен.

Ну, если очень интересно — можно перерыть, но в ЯБ, к примеру по-другому — и тут сорсы никак не помогут, браузер закрыт.
Ну, сейчас они сэндбоксят файлы — не думаю, что это сложно обходится, в своё время обходил созданием батника и вызовом от туда.
Вы ничего не поняли. Мы ставим расширение через exe. Читайте внимательнее.
Решение вполне разумное — но ведь выдача сертификатов и их проверка решается опять же простым патчем хрома — сорсы и pdbшки в открытом доступе. Вопрос времени.
проблема в том, что в данном случае мы грузили распакованное расширение, гугл сам дал нам такую возможность, если её выпилить — как дебажить расширения?
Думаю что лаконичного и разумного решения кроме бдительности пользователя — нет, ведь везде присутствует человеческий фактор, есть вариант ставить наблюдение за записями в файл, но это легко обходиться патчем хрома.
Геннадий Короткевич все свои олимпиады в школе писал на Pascal'е — и получал первые места на ВКОШПе и т.п. — ну и что? Плох что-ли?

Information

Rating
Does not participate
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Date of birth
Registered
Activity

Specialization

Системный программист
Senior
From 400,000 ₽
Git
Linux
Python
C
C++
Algorithms and data structures
System Programming
C++ STL
Assembler
Multiple thread