Ваш вопрос действительно имеет 2-х частей:
- Должен ли я использовать
static_cast
или reinterpret_cast
работать с указателем на подстилающей битов объекта, не заботясь о типе объекта?
- Если я должен использовать
reinterpret_cast
, то есть void*
или char*
предпочтительнее адресовать этот базовый шаблон бита?
static_cast
: Преобразование между типами, используя комбинацию неявных и определенных пользователем преобразований
В 5.2.9 [expr.static.cast] 13 стандартного, на самом деле, приводит пример :
T* p1 = new T;
const T* p2 = static_cast<const T*>(static_cast<void*>(p1));
Он использует неявное приведение:
Указатель prvalue для любого (необязательно cv-квалифицированного) типа объекта T
может быть преобразован в указатель prvalue (идентично с квалификацией cv) void
. Результирующий указатель представляет то же место в памяти, что и исходное значение указателя.Если исходный указатель является значением нулевого указателя, результатом является значение нулевого указателя для типа назначения. *
Там нет, однако, не неявное приведение из указателя типа T
к char*
. Таким образом, единственный способ выполнить этот бросок - с reinterpret_cast
.
reinterpret_cast
: Преобразование между типами по переинтерпретации основной битовый шаблон
Таким образом, в ответ на части ваш вопрос, когда вы приводите к void*
или char*
вы хотите работать с базовый бит-шаблон, reinterpret_cast
следует использовать, потому что его использование означает, что читатель преобразует в/из базового шаблона бита.
Дальше сравните void*
по char*
. Решение между этими двумя может быть более зависимым от приложения. Если вы собираетесь использовать стандартную библиотечную функцию с подстилающими битами просто использовать тот тип, который функция принимает:
void*
используется в mem
функциях, предусмотренных в cstring
библиотеке
read
и write
использование char*
как Входы
Примечательно, что для конкретных объектов библиотеки C++ char*
для указания на память. Сохранение в памяти как void*
, по-видимому, сохранилось по соображениям совместимости как указатель here. Итак, если функция библиотеки cstring
не будет использоваться в вашем базовом бит-патерне, используйте поведение конкретных библиотек C++ для ответа на часть вашего вопроса: Предпочитаете char*
- void*
.
Как правило, вы производите символ 'char *', чтобы сделать что-то с отдельными байтами. Вы не можете сделать это с помощью 'void *'. – NathanOliver
@NathanOliver Итак, вы говорите как «memcpy» или подобное? –
Ну, «memcpy» - один из них. Функция 'read' и' wrtie' потоков - это другие. Если вам нужно отправить материал поверх данных com, вы также сделаете это. – NathanOliver