Может ли __restrict__ быть применен к shared_ptr <T>? - PullRequest
9 голосов
/ 29 января 2012

Интеллектуальные указатели - это указатели внизу, поэтому есть ли способ определения параметра shared_ptr для функции, который не накладывает псевдоним на другой shared_ptr или другой указатель любого рода?

Или это длякакая-то причина, ненужная?

Меня интересуют компиляторы gcc> = 4.2 и llvm-clang> = 2.0 (ответы для других компиляторов также будут интересны).

Ответы [ 2 ]

7 голосов
/ 29 января 2012

Просто извлеките указатели с помощью .get() и отметьте их как __restrict__.Помните, что ввод __restrict__ в параметры функции аналогичен вводу __restrict__ в локальные переменные.В частности, компилятор не пытается помешать вам вызвать функцию с двумя указателями, которые явно указывают на один и тот же объект;например, foo(i,i).

Если вы хотите пообещать компилятору, что некоторые указатели не ссылаются друг на друга, что позволяет компилятору выполнять больше оптимизаций, используйте этот код ниже и выполняйте свои операции через xp и yp вместо x и y.

#include<iostream>
#include<memory>
using namespace std;

void foo(shared_ptr<int> x, shared_ptr<int> y) {
        int * __restrict__ xp = x.get();
        int * __restrict__ yp = y.get();
}

int main() {
        shared_ptr<int> i = make_shared<int>(3);
        shared_ptr<int> j = make_sharet<int>(4);
        foo(i,j);
}
5 голосов
/ 29 января 2012

Если вы хотите выполнить операции без псевдонимов с базовым объектом, связанным с общим указателем, вы можете явно делегировать рабочую подпрограмму, которая принимает параметр без псевдонима:

void worker (mytype *__restrict x, mytype *__restrict y)
{
    // do something with x, y with a no-alias guarantee
}

int main()
{
    std::shared_ptr<mytype> p(new mytype);
    std::shared_ptr<mytype> q(new mytype);

// explicitly delegate the shared object
    worker(p.get(), q.get());

    return 0;
}

Я не совсем уверен, что вы имеете в виду, но это позволило бы интеллектуальному указателю безопасно управлять высокоуровневым управлением памятью, в то же время выполняя низкоуровневую работу , возможно, более эффективно. с указателями без псевдонимов.

Как указал @BenVoigt, restrict является лишь формально частью c99 - c++ не должен ничего знать об этом. MSVC поддерживает его в любом случае через __restrict и, как вы сказали, GCC имеет __restrict__.

Надеюсь, это поможет.

...