Pointer as something with size() method
От: ioctl  
Дата: 05.03.21 06:06
Оценка:
Есть char*, считанный из сокета. В момент его зачитывания его размер известен.

Есть ли возможность завернуть его во что нибудь стандартное, с методом size() или length()?

Есть vector, но с ним придется копировать память, чего не хотелось бы.

Есть ли что нибудь, что позволяет обернуть указатель?
Re: Pointer as something with size() method
От: _NN_ www.nemerleweb.com
Дата: 05.03.21 06:21
Оценка: 6 (1) +1
Здравствуйте, ioctl, Вы писали:

I>Есть char*, считанный из сокета. В момент его зачитывания его размер известен.


I>Есть ли возможность завернуть его во что нибудь стандартное, с методом size() или length()?


std::span

I>Есть vector, но с ним придется копировать память, чего не хотелось бы.

I>Есть ли что нибудь, что позволяет обернуть указатель?

А если у вас не C++20 то можно написать простую обёртку над указателем и размером:
https://github.com/tcbrindle/span
https://github.com/microsoft/GSL/blob/main/include/gsl/span
http://rsdn.nemerleweb.com
http://nemerleweb.com
Отредактировано 05.03.2021 9:25 _NN_ . Предыдущая версия .
Re: Pointer as something with size() method
От: Igore Россия  
Дата: 05.03.21 07:17
Оценка: 2 (1)
Здравствуйте, ioctl, Вы писали:

I>Есть char*, считанный из сокета. В момент его зачитывания его размер известен.


I>Есть ли возможность завернуть его во что нибудь стандартное, с методом size() или length()?

std::string_view? C++17
Re[2]: Pointer as something with size() method
От: ioctl  
Дата: 05.03.21 08:53
Оценка:
Здравствуйте, Igore, Вы писали:

I>>Есть ли возможность завернуть его во что нибудь стандартное, с методом size() или length()?

I>std::string_view? C++17

Классная штука, а нет ли такого же для числовых типов данных?
Re[3]: Pointer as something with size() method
От: _NN_ www.nemerleweb.com
Дата: 05.03.21 09:24
Оценка:
Здравствуйте, ioctl, Вы писали:

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


I>>>Есть ли возможность завернуть его во что нибудь стандартное, с методом size() или length()?

I>>std::string_view? C++17

I>Классная штука, а нет ли такого же для числовых типов данных?


Чем std::span не подошёл ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Pointer as something with size() method
От: Pzz Россия https://github.com/alexpevzner
Дата: 05.03.21 10:01
Оценка: 3 (1) +3
Здравствуйте, ioctl, Вы писали:

I>Есть char*, считанный из сокета. В момент его зачитывания его размер известен.


I>Есть ли возможность завернуть его во что нибудь стандартное, с методом size() или length()?


I>Есть vector, но с ним придется копировать память, чего не хотелось бы.


Тебе все равно нужен буфер, куда читать из сокета. Вот и читай прям в буфер вектора, он так умеет, насколько я помню. Аллоцируй с запасом, а потом обрезай длину до реально прочитанной — это не приводит к реаллокации буфера.
Re[2]: Pointer as something with size() method
От: rg45 СССР  
Дата: 05.03.21 16:23
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Аллоцируй с запасом, а потом обрезай длину до реально прочитанной


Можно просто сериализовать размер перед данными и резервировать потом буфер точного размера.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[3]: Pointer as something with size() method
От: Pzz Россия https://github.com/alexpevzner
Дата: 05.03.21 17:14
Оценка:
Здравствуйте, rg45, Вы писали:

Pzz>>Аллоцируй с запасом, а потом обрезай длину до реально прочитанной


R>Можно просто сериализовать размер перед данными и резервировать потом буфер точного размера.


Не знаю, о чем ты говоришь, но чтобы узнать количество доступных данных до их фактического вычитывания, понадобится лишний системный вызов.
Re[4]: Pointer as something with size() method
От: Videoman Россия https://hts.tv/
Дата: 05.03.21 22:12
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Не знаю, о чем ты говоришь, но чтобы узнать количество доступных данных до их фактического вычитывания, понадобится лишний системный вызов.


Человек же в самом первом сообщении пишет:

В момент его зачитывания его размер известен

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.