Как я могу получить энергозависимый через указатель на энергонезависимый? - PullRequest
0 голосов
/ 27 мая 2018

Я работаю с API, который дает мне указатель для ввода-вывода с отображением в памяти.Это делается путем заполнения аргумента указатель на указатель:

int map(void** p);

Поскольку это ввод-вывод с отображением в памяти, я вполне уверен, что здесь следует использовать volatile.(Я не знаю, почему они не сделали параметр volatile void**.)

Но мой volatile void** неявно не конвертируется в void** функции, поэтому я не могу простопередайте его напрямую:

volatile void* p;
map(&p); // Error: no known conversion from 'volatile void **' to 'void **'.

В настоящее время я работаю над этим с помощью дополнительной переменной и отдельного шага присваивания:

volatile void* p;
void* pNonVolatile;
map(&pNonVolatile);
p = pNonVolatile;

Это кажется многословным.Безопасно ли в этом случае вместо приведения указателя указывать volatile?т.е.

volatile void* p;
map(const_cast<void**>(&p));

1 Ответ

0 голосов
/ 27 мая 2018

С точки зрения языка C ++ это может привести к неопределенному поведению в библиотеке, но не в вашем коде, использующем const_cast.

Однако из того, что вы описали, библиотека, вероятно, неиспользуйте C или C ++ для записи в это пространство памяти (вы упомянули, что он использует ввод-вывод с отображением в памяти).Так что неопределенное поведение, которое может существовать, если библиотека разыменовывает ваш указатель без volatile, не имеет значения, потому что это делает аппаратное обеспечение, а не программное обеспечение.

В любом случае, используете ли вы const_cast или «extraуказатель затем назначить "решение не имеет значения.Оба должны быть в порядке, если память записана аппаратным устройством, но не в порядке, если она написана библиотекой без volatile.

...