Ограниченный доступ для выделенных массивов, принадлежащих отдельному объектуC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Ограниченный доступ для выделенных массивов, принадлежащих отдельному объекту

Сообщение Anonymous »

Я думал о пользе нестандартного ключевого слова __restrict в C и C++ и о том, как его эффект можно имитировать путем тщательного объявления (непересекающихся) объектов значений.
Ограничение обычно объясняется косвенным доступом к памяти, который может перекрывать или не перекрывать адреса памяти:

Код: Выделить всё

int foo(Pointer1 a, Pointer2 b) {  // adding non-standard `restrict` keyword might hint that dreaded_function_call is never called
*a = 5;
*b = 6;
if(*a == *b) dreaded_function_call();  // in isolation this function may or may not be called
}
Если компилятор может доказать, что a и b не перекрываются, то dreaded_function_call() никогда не вызывается и не упоминается при компиляции.< /p>
Это именно то, чего я достиг в этом примере, по крайней мере, с GCC, dreaded_function_call даже не появляется в сгенерированном машинном коде.

Код: Выделить всё

#include

template void modify_v(It);

void dreaded_function_call();

template
void foo(It1 a, It2 b) {
*a = 5;
*b = 6;
if(*a == *b) dreaded_function_call();
}

int main() {
std::vector v1(10); modify_v(v1.begin());
std::vector v2(10); modify_v(v2.begin());

foo(v1.begin() + 5, v2.begin() + 5);
}
Однако, если я немного изменю код для генерации самого вектора из отдельных вызовов функций, я потеряю эту оптимизацию.
Я могу это наблюдать, поскольку сгенерированный код будет разветвляться и все равно рассмотрите возможность вызова dreaded_function_call.

Код: Выделить всё

std::vector make_v();
...
int main() {
std::vector v1 = make_v();
std::vector v2 = make_v();

foo(v1.begin() + 5, v2.begin() + 5);
}
Что здесь происходит? возвращает копию, поэтому версии v1 и v2 должны быть непересекающимися, как и в приведенном выше случае.
Однако компилятор не выполняет такую ​​же оптимизацию.Это просто упущенная возможность для оптимизации, или эта оптимизация будет совершенно недействительной?
Вот скомпилированный код, иллюстрирующий оба случая. с GCC: https://godbolt.org/z/WKKzs1edc
(Clang дает такое же поведение.)

Подробнее здесь: https://stackoverflow.com/questions/791 ... ate-object
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»