Re[9]: Про перемещение (на примере кода)
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 17.03.25 23:25
Оценка: -1 :)
Здравствуйте, Shmj, Вы писали:


S>В компил-тайме не получится, т.к. тип пакета узнаю на основе поступающих данных.


Ну, если подсунуть компайл-тайм пакет, то вроде всё в компайле и отработает. Рантайм пакет конечно какая-то часть будет в рантайме работать
Маньяк Робокряк колесит по городу
Re[7]: Про перемещение (на примере кода)
От: __kot2  
Дата: 18.03.25 02:17
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Здравствуйте, __kot2, Вы писали:


S>>>На пример как?

__>>Для этого нужно целиком задачу понимать. Сформулируй ее как нить более цельно

S>Сетевой бинарный пакет. С помощью методов устанавливаем удобным образом отдельные части пакета — как то версия, тип пакета и пр. Но так же должна быть возможность получить данные пакета целиком для отправки (или предварительного шифрования).

Установка данных частями это уже антипаттерн, так как можем легко поломать их консистентность. Он должен быть разбит на атомарные независимые вещи

я никогда не работал с пакетами напрямую, но это выглядит примерно так — есть данные для отправки, есть служебные структуры пакета, это все сериализуется куда-то, это все разные классы. встает вопрос о переиспользовании буфера для отправки другого пакета. так вот не надо это делать так явно. мы сериализуем данные и отдаем их куда-то для отправки, берем новый буфер и туда уже пихаем новые данные. а вот аллокатор для этих буферов может иметь некий кольцевой буфер в выделенном заранее массивчике или около того, чтобы там не new/delete работал медленно, а что-то кастомное
Отредактировано 18.03.2025 4:56 __kot2 . Предыдущая версия .
Re[10]: Про перемещение (на примере кода)
От: Shmj Ниоткуда  
Дата: 18.03.25 07:50
Оценка: :))
Здравствуйте, Marty, Вы писали:

M>Ну, если подсунуть компайл-тайм пакет, то вроде всё в компайле и отработает. Рантайм пакет конечно какая-то часть будет в рантайме работать


Все в рантайме, конечно.

Компил-тайм этот редко где вообще нужен — в основном идет как ребус или хорохориться друг перед другом на форумах. В серьезных проектах он не используется или используется по минимуму — совсем простые вещи.
=сначала спроси у GPT=
Re[8]: Про перемещение (на примере кода)
От: Shmj Ниоткуда  
Дата: 18.03.25 08:01
Оценка: :)
Здравствуйте, __kot2, Вы писали:

__>Установка данных частями это уже антипаттерн, так как можем легко поломать их консистентность. Он должен быть разбит на атомарные независимые вещи


Всегда все устанавливают данные пакета частями одну часть за другой

А какие альтернативы?

__>я никогда не работал с пакетами напрямую, но это выглядит примерно так — есть данные для отправки, есть служебные структуры пакета, это все сериализуется куда-то, это все разные классы. встает вопрос о переиспользовании буфера для отправки другого пакета. так вот не надо это делать так явно. мы сериализуем данные и отдаем их куда-то для отправки, берем новый буфер и туда уже пихаем новые данные. а вот аллокатор для этих буферов может иметь некий кольцевой буфер в выделенном заранее массивчике или около того, чтобы там не new/delete работал медленно, а что-то кастомное


Единый буффер — может и не плохо, но если многопоточная среда — то усложняет значительно. Нужно по количеству потоков выделять n буфферов этих, ожидание, очередь. Возможно добавлю, если будет время, но для начала чтобы хотя бы лишние копии на пустом месте не создавались.
=сначала спроси у GPT=
Re[9]: Про перемещение (на примере кода)
От: __kot2  
Дата: 18.03.25 09:28
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Здравствуйте, __kot2, Вы писали:


__>>Установка данных частями это уже антипаттерн, так как можем легко поломать их консистентность. Он должен быть разбит на атомарные независимые вещи


S>Всегда все устанавливают данные пакета частями одну часть за другой

ну я и говорю, у меня опыта в этой области нет, исхожу просто из общих соображений

S>Единый буффер — может и не плохо, но если многопоточная среда — то усложняет значительно. Нужно по количеству потоков выделять n буфферов этих, ожидание, очередь. Возможно добавлю, если будет время, но для начала чтобы хотя бы лишние копии на пустом месте не создавались.

один из решений это возвращать что-то в духе buffer_view по аналогии с string_view, то есть невладеющий указатель
Re[11]: Про перемещение (на примере кода)
От: rg45 СССР  
Дата: 18.03.25 09:48
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Компил-тайм этот редко где вообще нужен — в основном идет как ребус или хорохориться друг перед другом на форумах. В серьезных проектах он не используется или используется по минимуму — совсем простые вещи.


По-моему, ты злоупотребляешь обобщениями.
--
Справедливость выше закона. А человечность выше справедливости.
Re[9]: Про перемещение (на примере кода)
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 18.03.25 09:53
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Единый буффер — может и не плохо, но если многопоточная среда — то усложняет значительно. Нужно по количеству потоков выделять n буфферов этих, ожидание, очередь. Возможно добавлю, если будет время, но для начала чтобы хотя бы лишние копии на пустом месте не создавались.


Если ты не террабиты собрался прокачивать, то существующие в плюсах оптимизации вполне себе справятся, а ты занимаешься херней
Маньяк Робокряк колесит по городу
Re[7]: Про перемещение (на примере кода)
От: B0FEE664  
Дата: 18.03.25 17:37
Оценка:
Здравствуйте, Shmj, Вы писали:

S>>>На пример как?

__>>Для этого нужно целиком задачу понимать. Сформулируй ее как нить более цельно

S>Сетевой бинарный пакет. С помощью методов устанавливаем удобным образом отдельные части пакета — как то версия, тип пакета и пр. Но так же должна быть возможность получить данные пакета целиком для отправки (или предварительного шифрования).


Не надо так делать: поменяется версия и всё по новой переписывать придётся.
Данные отдельно, отсылка данных отдельно.
Цепочка примерно такая: прикладные данные -> спец struct данных для сообщения -> серилизация в буфер (в зависимости от версии) -> отсылка буфера (и только если данные по настоящему большие (что для бинарных протоколов не характерно, то серилизация прямо в поток вывода).
В любом случае под каждое сообщение должна быть структура данных, иначе это write only код, замучаетесь поддерживать.
И каждый день — без права на ошибку...
Re[9]: Про перемещение (на примере кода)
От: B0FEE664  
Дата: 18.03.25 17:38
Оценка:
Здравствуйте, Shmj, Вы писали:

__>>Установка данных частями это уже антипаттерн, так как можем легко поломать их консистентность. Он должен быть разбит на атомарные независимые вещи

S>Всегда все устанавливают данные пакета частями одну часть за другой

У вас чтение или запись?
И каждый день — без права на ошибку...
Re: Про перемещение (на примере кода)
От: _NN_  
Дата: 23.03.25 20:12
Оценка: :)
Здравствуйте, Shmj, Вы писали:

А можно рассказать какую всё таки задачу должен решать этот класс ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Про перемещение (на примере кода)
От: Shmj Ниоткуда  
Дата: 12.04.25 22:26
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>А можно рассказать какую всё таки задачу должен решать этот класс ?


Уже писал выше — быть удобным способом работать с бинарным сетевым пакетом — позволять легким способом устанавливать/получать те или иные части пакета.
=сначала спроси у GPT=
Re[3]: Про перемещение (на примере кода)
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 12.04.25 22:39
Оценка: -1 :)
Здравствуйте, Shmj, Вы писали:

_NN>>А можно рассказать какую всё таки задачу должен решать этот класс ?


S>Уже писал выше — быть удобным способом работать с бинарным сетевым пакетом — позволять легким способом устанавливать/получать те или иные части пакета.


Не решает. Не удобно. Не легким способом.
Маньяк Робокряк колесит по городу
Re[4]: Про перемещение (на примере кода)
От: Shmj Ниоткуда  
Дата: 13.04.25 01:04
Оценка:
Здравствуйте, Marty, Вы писали:

S>>Уже писал выше — быть удобным способом работать с бинарным сетевым пакетом — позволять легким способом устанавливать/получать те или иные части пакета.

M>Не решает. Не удобно. Не легким способом.

А что вам удобно? Чем плохо обернуть массив байт пакета и получать/устанавливать те или иные части в удобном виде просто как вызов функции get|set?
=сначала спроси у GPT=
Re[5]: Про перемещение (на примере кода)
От: rg45 СССР  
Дата: 13.04.25 01:39
Оценка:
Здравствуйте, Shmj, Вы писали:

S>А что вам удобно? Чем плохо обернуть массив байт пакета и получать/устанавливать те или иные части в удобном виде просто как вызов функции get|set?


Тепреть не могу аналогий, но в данном случае будет уместно, всё-таки.

Какую задачу решает, например, электрическая лампочка? Она обеспечивает освещение. А какую задачу решает мракобес, который сверлит в электрической лампочке отверстие, через которое удобно заливать керосин? Да никакую. Он просто не понимает принцип действия электрической лампочки, вот и всё.
--
Справедливость выше закона. А человечность выше справедливости.
Re[6]: Про перемещение (на примере кода)
От: Shmj Ниоткуда  
Дата: 13.04.25 02:21
Оценка:
Здравствуйте, rg45, Вы писали:

S>>А что вам удобно? Чем плохо обернуть массив байт пакета и получать/устанавливать те или иные части в удобном виде просто как вызов функции get|set?

R>Тепреть не могу аналогий, но в данном случае будет уместно, всё-таки.

Зачем аналогии — можно же сразу конкретику — код:

MyPacket packet;

packet.setType(1);                        // Тип пакета = 1
packet.setNonce(0xABCDEF01);              // Nonce
packet.setTimestamp(std::time(nullptr));  // Временная метка


— что не так и какие альтернативы?
=сначала спроси у GPT=
Re[7]: Про перемещение (на примере кода)
От: rg45 СССР  
Дата: 13.04.25 12:35
Оценка: :)
Здравствуйте, Shmj, Вы писали:

S>
S>MyPacket packet;

S>packet.setType(1);                        // Тип пакета = 1
S>packet.setNonce(0xABCDEF01);              // Nonce
S>packet.setTimestamp(std::time(nullptr));  // Временная метка
S>


S>- что не так и какие альтернативы?


Во-первых, говнокод. На кой хер у тебя в классе пакета такое количество модифицирующих аксессоров. Тебе действительно нужно многократно менять свойсва объекта пакета? Нафига? Сисшарп головного мозга какой-то.

Во-вторых, это ты скажи, что не так. И нафига тебе заливать керосин в электрическую лампочку.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 13.04.2025 12:40 rg45 . Предыдущая версия .
Re[7]: Про перемещение (на примере кода)
От: rg45 СССР  
Дата: 13.04.25 13:22
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Зачем аналогии — можно же сразу конкретику — код:


Ты, походу, снова нифига не понял.

Тебе вопрос задали
Автор: _NN_
Дата: 23.03 23:12
: какую задачу ты решаешь. На этот вопрос ты так и не ответил. Превращение C++ в C# — это не задача — это заливание керосина в электрическую лампочку.

Теперь дошла аналогия?

P.S. Задача могла бы звучать, например, так: "помогите спроектировать класс пакета, а то у меня какая-то фигня получается".
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 13.04.2025 13:32 rg45 . Предыдущая версия . Еще …
Отредактировано 13.04.2025 13:31 rg45 . Предыдущая версия .
Re[8]: Про перемещение (на примере кода)
От: Shmj Ниоткуда  
Дата: 14.04.25 13:00
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, Shmj, Вы писали:


S>>
S>>MyPacket packet;

S>>packet.setType(1);                        // Тип пакета = 1
S>>packet.setNonce(0xABCDEF01);              // Nonce
S>>packet.setTimestamp(std::time(nullptr));  // Временная метка
S>>


S>>- что не так и какие альтернативы?


R>Во-первых, говнокод. На кой хер у тебя в классе пакета такое количество модифицирующих аксессоров. Тебе действительно нужно многократно менять свойсва объекта пакета? Нафига? Сисшарп головного мозга какой-то.


Ну это ж для примера. На самом деле из сеттеров setAuthCode в одном пакете типа uint64_t. Не устанавливаю сразу, т.к. удобнее внутри класса сформировать нужные поля для аутентификации.

Но геттеров больше, т.к. пакет работает в обе стороны — и формируем и парсим. И все в одном месте как бы.

R>Во-вторых, это ты скажи, что не так. И нафига тебе заливать керосин в электрическую лампочку.


Мне нужно сформировать массив байт с определенной структурой. В поток писать нельзя, т.к. этот пакет передается через FFI и там нет возможности захватить поток и в него писать.
=сначала спроси у GPT=
Re[8]: Про перемещение (на примере кода)
От: Shmj Ниоткуда  
Дата: 14.04.25 13:02
Оценка:
Здравствуйте, rg45, Вы писали:

R>Тебе вопрос задали
Автор: _NN_
Дата: 23.03 23:12
: какую задачу ты решаешь. На этот вопрос ты так и не ответил. Превращение C++ в C# — это не задача — это заливание керосина в электрическую лампочку.


Я ж писал — бинарный пакет с удобным доступом к частям пакета. В обе стороны — и формируем и парсим.

R>P.S. Задача могла бы звучать, например, так: "помогите спроектировать класс пакета, а то у меня какая-то фигня получается".


А как я могу понять что фигня, если оно работает?

Возможно что было бы лучше использовать поток а не массив байт, но пока в данном случае не получается.
=сначала спроси у GPT=
Re[9]: Про перемещение (на примере кода)
От: rg45 СССР  
Дата: 14.04.25 13:42
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Ну это ж для примера. На самом деле из сеттеров setAuthCode в одном пакете типа uint64_t. Не устанавливаю сразу, т.к. удобнее внутри класса сформировать нужные поля для аутентификации.


Я понял, что это для примера. Вопрос только, для какого примера. Какую задачу ты решаешь? Да никакую — так получается. Борешься с неприятным С++, чтобы сделать его приятным, как С#.
--
Справедливость выше закона. А человечность выше справедливости.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.