Jam*_*mes 9 c++ g++ clang shared-ptr restrict-qualifier
智能指针是下面的指针,所以有没有任何方法可以定义shared_ptr函数的参数,而不是别名另一个shared_ptr,或任何类型的另一个指针?
或者,由于某种原因,这是不必要的?
我关心的是gcc> = 4.2和llvm-clang> = 2.0编译器(其他编译器的答案也很有趣).
只需提取指针.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);
}
Run Code Online (Sandbox Code Playgroud)
如果要对与共享指针关联的基础对象执行非别名操作,则可以显式委托给带有非别名指针参数的工作例程:
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;
}
Run Code Online (Sandbox Code Playgroud)
我不确定你的想法,但这将允许智能指针安全地处理高级内存管理,而使用无别名指针可以更高效地执行低级别工作.
正如@BenVoigt指出的那样,restrict只是正式的一部分c99- c++不应该对此有所了解.MSVC支持也无妨通过__restrict和你说GCC了__restrict__.
希望这可以帮助.