首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用unique_ptr是否意味着我不必使用restrict关键字?

使用unique_ptr是否意味着我不必使用restrict关键字?
EN

Stack Overflow用户
提问于 2015-03-17 19:42:34
回答 2查看 420关注 0票数 3

当尝试让循环自动向量化时,我见过这样的代码:

代码语言:javascript
复制
void addFP(int N, float *in1, float *in2, float * restrict out)
{
    for (i = 0 ; i < N; i++)
    {
         out[i] = in1[i] + in2[i];
    }
}

在需要restrict关键字的地方,可以向编译器保证指针别名,这样它就可以向量化循环。

像这样的东西会做同样的事情吗?

代码语言:javascript
复制
void addFP(int N, float *in1, float *in2, std::unique_ptr<float> out)
{
    for (i = 0 ; i < N; i++)
    {
         out[i] = in1[i] + in2[i];
    }
}

如果这确实有效,那么哪个是更便携的选择呢?

在你试图自动向量化的循环中,std::unique_ptr可以用来代替restrict关键字吗?

EN

回答 2

Stack Overflow用户

发布于 2016-09-04 21:51:00

restrict is not part of C++11,相反,它是C99的一部分。

std::unique_ptr<T> foo;告诉你的编译器:我只需要这个作用域中的内存。一旦此作用域结束,请释放内存。

restrict告诉你的编译器:我知道你不能知道也不能证明这一点,但我发誓这是对这个函数中出现的这块内存的唯一引用。

unique_ptr不会停止别名,编译器也不应该假定别名不存在:

代码语言:javascript
复制
int* pointer = new int[3];
int* alias = pointer;

std::unique_ptr<int> alias2(pointer);
std::unique_ptr<int> alias3(pointer); //compiles, but crashes when deleting

因此,您的第一个版本在C++11中是无效的(尽管它可以在许多现代编译器上运行),并且第二个版本不能完成您所期望的优化。才能得到行为保护者std::valarray

票数 2
EN

Stack Overflow用户

发布于 2015-03-17 19:46:45

我不这样认为。假设代码如下:

代码语言:javascript
复制
auto p = std::make_unique<float>(0.1f);
auto raw = p.get();
addFP(1, raw, raw, std::move(p));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29098187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档