2014-02-12 7 views
0

Я нашел этот пост:Использования reinterpret_cast для преобразования двоичных данных со смещением в массиве символов

Why is memcpy slower than a reinterpret_cast when parsing binary data?

, где кто-то использует reinterpret_cast для преобразования двоичных данных в виде целого числа. Однако (я полагаю) число, которое они преобразуют, находится в 0-м элементе в массиве char *.

Как я могу использовать вышеприведенное для ситуаций, когда двоичное число, которое я хочу преобразовать, является смещением N байтов от начала массива символов?

Я хочу преобразовать двоичное число как можно меньше циклов процессора, следовательно, мой интерес к reinterpret_cast и вышеприведенный вопрос SO.

+2

'* reinterpret_cast (данные + byteOffset),' 'где byteOffset' может быть, например,' positionInArray * sizeof (const int) '. Это работает, когда вы хотите получить доступ к элементам в памяти, я не вижу причин, по которым их реинтерпретация меняет вещи :) –

+0

Следует отметить, что переинтерпретирование байтов с помощью 'reinterpret_cast' для изменения типов указателей не поддерживается C++ стандартный (и эквивалент в C, типы указателей каста, обычно не поддерживается C). Это может привести как к нарушениям выравнивания, так и к нарушениям псевдонимов. Это можно сделать, если это поддерживает конкретная реализация C/C++. Однако вы не должны полагаться на него в C/C++ вообще; он подходит только для конкретных целевых реализаций. Чтобы соответствовать стандарту, байты должны быть скопированы в подходящий объект, как в случае с 'memcpy' (или, в C, можно использовать объединение). –

ответ

2

Просто добавьте смещение к адресу массива байтов. Вместо x, литье x+123

Но: Вы прочитали первую строчку вопроса (полужирный шрифт)?

TLDR: Я забыл включить оптимизацию компилятора. С оптимизацией производительность (почти) идентична.

+0

Yeh- Я посмотрел вниз, и этот человек обновил сообщение reinterpret_cast еще быстрее. Он посчитал что-то вроде 56ms против 60 мс, и я рассчитываю с точки зрения циклов процессора, а не милли/микросекунд (поэтому его определенно стоит использовать) – user997112

1

Если у вас есть *array; инициализируется с двоичными данными, то вы можете просто сделать это:

for (int offset = 0; offset < sizeof (array); offset++) 
{ 
    ... = *reinterpret_cast<const int*>(array + offset); 
} 
+0

Почему цикл? Он не хочет преобразовывать весь массив. И вы всегда присваиваете 'data', это эквивалентно' data = * reinterpret_cast (array + sizeof (array) -1); ' –

+0

@ FilipeGonçalves Возможно, я ошибочно полагал, что когда он говорил о 0-й элемент и доступ к n-му смещению, в котором он или она шел в конечном итоге ... – cytoscope