Меня это очень долго беспокоило: как выполнить преобразование указателя из чего угодно в char *
для выгрузки двоичного файла на диск.
В C вы даже не думаете об этом.
double d = 3.14;
char *cp = (char *)&d;
// do what u would do to dump to disk
Однако в C ++, где все говорят, что C-cast осуждается, я делаю это:
double d = 3.14;
auto cp = reinterpret_cast<char *>(&d);
Теперь это скопировано из cppreference , поэтому я предполагаю, что это правильный путь.
Однако я читал из нескольких источников, что это UB.(например, этот ) Так что я не могу не задаться вопросом, существует ли вообще какой-либо путь «БД» (согласно этому посту его нет).
Другой сценарий, с которым я часто сталкиваюсь, этореализовать API, как это:
void serialize(void *buffer);
, где вы бы много чего сбросили в этот буфер.Теперь я делаю это:
void serialize(void *buffer) {
int intToDump;
float floatToDump;
int *ip = reinterpret_cast<int *>(buffer);
ip[0] = intToDump;
float *fp = reinterpret_cast<float *>(&ip[1]);
fp[0] = floatToDump;
}
Ну, я думаю, это тоже UB.
Теперь, действительно, нет никакого способа "DB", чтобы выполнить любую из этих задач?Я видел, как кто-то использовал uintptr_t
для выполнения задачи, аналогичной serialize
, с указателем в виде целочисленной математики наряду с sizeof
, но я предполагаю, что это также UB.
Даже если ониUB, авторы компиляторов обычно делают рациональные вещи, чтобы убедиться, что все в порядке.И я в порядке с этим: это не лишняя вещь, которую нужно просить.
Так что мои вопросы действительно относятся к двум общим задачам, упомянутым выше:
- Действительно ли нет«БД» - способ их достижения, который удовлетворит лучших фанатов С ++?
- Есть ли лучший способ сделать их, кроме того, что я делал?
Спасибо!