Должны ли указатели std :: byte использоваться для арифметики указателей? - PullRequest
0 голосов
/ 11 октября 2018

Кажется, std::byte стало способом (в C ++ 17) работать с буферами, содержащими представления объектов, но неясно, позволяет ли это намерение выполнять арифметику указателей.

вопрос в названии специально обозначен как должен , потому что я ищу рекомендации.Например, void* может использоваться для арифметики указателей в качестве расширений gcc, но не является стандартным (по крайней мере это верно для C ), следовательно, возможна, но не является рекомендацией .

Я знаю, что мотивация std::byte состоит в том, чтобы отделить символ и числовые аспекты от понятия байт .Но в то же время, остается ли арифметика указателей?

EDIT: откорректирована, чтобы уточнить, что я собираюсь сделать «арифметику указателей», используя std::byte*, а не числовое значение хранилищ указателей в std::byte s

1 Ответ

0 голосов
/ 11 октября 2018

Да, std::byte* может использоваться для арифметики указателей.

И вы даже можете делать такие вещи, как

struct foo{int x,y};
foo f;
int* ptr_to_y = reinterpret_cast<int*>(reinterpret_cast<std::byte*>(&f)+offsetof(foo,y));

Вы должны быть осторожны, чтобы ваши местоположения были доступны через вашоперации.Тот факт, что указатели как целые числа получают правильный результат, не означает, что код C ++ выполняет определенное поведение.В C ++ есть ряд причуд, позволяющих оптимизатору «знать», что определенное значение не может быть изменено.

struct loc {
  int x,y;
};

void f( int* );

loc work( loc l ) {
  l.x=3;
  f(&l.y);
  return l;
}

в приведенном выше случае, кто-то, кто использовал указатель &l.y для арифметики указателей(в пределах f) и изменение l.x, независимо от того, перешли они на std::byte* или нет, будет вести неопределенное поведение.Компилятору разрешается предполагать, что возвращенное значение l будет иметь значение .x, равное 3.

. Это не новые ловушки, введенные std::byte*.

...