/>У меня есть две функции make_v1 и make_v2, которые возвращают объект, подобный массиву, по значению.
(Это может быть, например, std::vector, важным моментом является то, что конструктор копирования четко распределяет память).
Код: Выделить всё
#include
template void modify_v(It);
void dreaded_function();
template
void foo(It1 a, It2 b) {
*a = 5;
*b = 6;
if(*a == *b) dreaded_function(); // this is never called if a and b do not overlap
}
int main() {
std::vector v1 = make_v1();
std::vector v2 = make_v2();
foo(v1.begin(), v2.begin());
}
Это всего лишь пример псевдонимов указателей, просто для диагностируйте ситуацию.
Имеются хорошо известные случаи псевдонимов указателей, создающих худшие проблемы с производительностью.
https://godbolt.org/z/345PKrsnx
Какие высокоуровневые подсказки я могу дать компилятору в C++ (или, возможно, с использованием расширений), что диапазоны итераторов находятся в областях памяти, которые не могут перекрываться?
Если бы это был C или если бы я использовал указатели и расширения C++, я мог бы использовать __restrict и интерфейс указателя, но мне нужно что-то более высокоуровневое.
(Спасибо @TedLygmo за указание на то, что __restrict каким-то образом работает для итераторов std::vector).
Единственный вариант, который я нашел, — это очень явно указать копия:
Код: Выделить всё
...
std::vector v1 = static_cast(make_v1());
std::vector v2 = static_cast(make_v2());
https://godbolt.org/z/nYfKeTKqj
Но это уродливо, и он также создает копию, а также, если make_v станет включенной функцией позже, решение будет иметь свои затраты.
(Кроме того, это все еще не убедит GCC!)Это единственный способ, которым я могу, чтобы компилятор, чем v1 и v2, не перекрывали память? Есть ли более простое решение?
Должно ли [[предполагать]] работать для этого в конечном итоге?
На данный момент лучшее, на что я надеюсь, это какое-нибудь ключевое слово/ расширение, которое «имитирует» результат make_v1/
Код: Выделить всё
make_v2
Код: Выделить всё
v2
Подробнее здесь: https://stackoverflow.com/questions/791 ... neric-code