В те дни я много читал о reinterpret_cast<>
и о том, как его использовать (и избегать этого в большинстве случаев).
Хотя я понимаю, что использование reinterpret_cast<>
для приведения, скажем,От unsigned char*
до char*
определяется реализация (и, следовательно, непереносимая ), похоже, что эффективно не может преобразовать один в другой.
Допустим, я использую библиотеку, которая имеет дело с unsigned char*
, для обработки некоторых вычислений.Внутренне, я уже использую char*
для хранения своих данных (и я не могу изменить их, потому что это убило бы щенков, если бы я это сделал).
Я бы сделал что-то вроде:
char* mydata = getMyDataSomewhere();
size_t mydatalen = getMyDataLength();
// We use it here
// processData() takes a unsigned char*
void processData(reinterpret_cast<unsigned char*>(mydata), mydatalen);
// I could have done this:
void processData((unsigned char*)mydata, mydatalen);
// But it would have resulted in a similar call I guess ?
Если я хочу, чтобы мой код был легко переносимым, похоже, у меня нет другого выбора, кроме как сначала скопировать свои данные.Что-то вроде:
char* mydata = getMyDataSomewhere();
size_t mydatalen = getMyDataLength();
unsigned char* mydata_copy = new unsigned char[mydatalen];
for (size_t i = 0; i < mydatalen; ++i)
mydata_copy[i] = static_cast<unsigned char>(mydata[i]);
void processData(mydata_copy, mydatalen);
Конечно, это крайне неоптимально, и я даже не уверен, что оно более портативное, чем первое решение.
Так что вопрос в том, что бы выделать в этой ситуации иметь переносимый код?