Если вы хотите выполнить операции без псевдонимов с базовым объектом, связанным с общим указателем, вы можете явно делегировать рабочую подпрограмму, которая принимает параметр без псевдонима:
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__
.
Надеюсь, это поможет.