std :: copy по указателям на изменчивые данные - PullRequest
1 голос
/ 23 апреля 2019

Предположим, у меня есть указатели ввода и вывода для изменчивых данных ..... и я пытаюсь использовать std::copy для них:

uint32_t volatile* input = /*    */;
uint32_t volatile* output =  /*    */;
std::copy(input,input+512,output);

Должна ли это компилироваться?Я думаю, что так и должно быть, но это не сработает на gcc, потому что он пытается использовать __builtin_memmove, который требует указателей на энергонезависимые данные ...... ссылка на godbolt: https://godbolt.org/z/6yDzqb

Так что яугадайте, мой вопрос заключается в следующем: это ошибка в стандартной библиотеке или это может не скомпилироваться?

1 Ответ

1 голос
/ 23 апреля 2019

Да, это должно скомпилироваться. std::copy указано [alg.copy] / 2 , чтобы вести себя , как если бы значение, полученное при разыменовании итератора для каждого элемента в исходном диапазоне, было просто присвоено значению, полученному из разыменование итератора до соответствующего элемента в диапазоне назначения. volatile std::uint32_t может быть присвоено volatile std::uint32_t, потому что volatile std::uint32_t не является const [basic.lval] / 7 .

Кроме того, обратите внимание, что этот , по-видимому, компилирует в транковой версии GCC (по крайней мере, ту, которая доступна на godbolt). Так что я бы сказал, что это почти наверняка была ошибка, и теперь она, похоже, исправлена ​​& hellip;

Помимо всего этого, вы можете рассмотреть возможность включения <cstdint> вместо <stdint.h>, поскольку заголовки стандартной библиотеки C доступны только в C ++ как устаревшая функция совместимости [depr.c.headers] . Когда вы это сделаете, помните о том, что не определено [needs.headers] / 4 , действительно ли сущности, объявленные в этих стандартных заголовках, такие как std::uint32_t, действительно доступны в глобальном пространстве имен , Таким образом, вы можете рассмотреть возможность использования std::uint32_t, а не просто uint32_t и т. Д., Поскольку гарантированно будет присутствовать только первое из них & hellip;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...