【问题标题】:Can __restrict__ be applied to shared_ptr<T>?__restrict__ 可以应用于 shared_ptr<T> 吗?
【发布时间】:2012-02-21 10:05:04
【问题描述】:

智能指针是下面的指针,那么有什么方法可以将函数的 shared_ptr 参数定义为不为另一个 shared_ptr 或其他任何类型的指针起别名?

或者,出于某种原因,这是不必要的吗?

我关心 gcc >=4.2 和 llvm-clang >=2.0 编译器(其他编译器的答案也很有趣)。

【问题讨论】:

  • C++ 没有任何 restrict__restrict__ 关键字。如果您要询问特定编译器中的语言扩展,您需要说出是哪个。
  • @BenVoigt 抱歉 - 在编辑中澄清。
  • 似乎不太可能想要处理受限指针的函数想要声明指针的共享所有权。更不用说在共享所有权的系统中,您最终会知道指针确实是不同的。无论如何,我猜你的函数 actualky 想要使用 [restricted] 指针而不是 std::shared_ptr&lt;T&gt;s。

标签: c++ g++ clang shared-ptr restrict-qualifier


【解决方案1】:

只需提取带有.get() 的指针并将它们标记为__restrict__。请记住,将__restrict__ 放入函数参数中与将__restrict__ 放入局部变量中相同。特别是,编译器不会试图阻止您使用两个明显指向同一个对象的指针来调用函数。例如foo(i,i).

如果您想向编译器承诺某些指针不会相互引用,从而允许编译器进行更多优化,请使用下面的代码并通过xpyp 进行操作,而不是xy

#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);
}

【讨论】:

  • 为什么说将函数参数标记为restrict与声明本地restrict指针变量不同呢?这与gcc 优化有关还是restrict 的潜在行为(我目前不理解;))
  • 我说它没有不同。我会尝试改写它以使其更清晰。
  • 我正要写这个,但我找不到任何 __restrict__ 的语法说明它是否允许用于局部变量。某处有文档吗?
  • @BenVoigt restrict 被定义为 type-qualifier 就像 constvolatile (C99 §6.7.3/1)。 __restrict__ 是 GCC 扩展,可能没有任何形式语法精确定义,即使存在。
  • 同意,@BenVoigt!编辑所以他们不别名。我想我打算在答案中讨论这个问题,但我忘记了,没有讨论就留下了这个错误。
【解决方案2】:

如果您想对与共享指针关联的底层对象执行非别名操作,您可以显式委托给采用非别名指针参数的工作例程:

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__

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2015-07-05
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多