智能指针是下面的指针,那么有没有办法将函数的shared_ptr
参数定义为不别名另一个shared_ptr
或任何类型的另一个指针?
或者出于某种原因,这是没有必要的吗?
我关心的是gcc>=4.2和llvm-crang>=2.0编译器(其他编译器的答案也很有趣)。
只需提取带有.get()
的指针并将其标记为__restrict__
。请记住,将__restrict__
放入函数参数与将__restrict__
放入局部变量相同。特别是,编译器不会试图阻止您使用明显指向同一对象的两个指针来调用函数;例如CCD_ 7。
如果您想向编译器承诺某些指针不会相互引用,从而允许编译器进行更多优化,那么请使用下面的代码,并通过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);
}
如果您想对与共享指针关联的底层对象执行非别名操作,您可以显式委托给一个使用非别名指针参数的工作例程:
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__
。
希望这能有所帮助。