Gug*_*ugi 5 c++ atomic openmp reference-type
OpenMP标准(<= 4.0)说atomic
:
#pragma omp atomic [read | write | update | capture ] new-line
expression-stmt
where
expression-stmt
是具有以下形式之一的表达式语句:
...
If子句是更新还是不存在:
x++;
...
在前面的表达式中:
x
和v
(如果适用)都是具有标量类型的l值表达式.
...
因此,当我正确解释这一点时,以下短代码片段是非法的:
int main()
{
int myCounter = 0;
int& reference = myCounter;
#pragma omp parallel for
for (int i = 0; i < 100; ++i)
{
#pragma omp atomic
reference++; // Increment through reference.
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
原因:根据这篇文章,引用(这里int& reference
)不是标量类型.但是标准明确规定它必须是一个,才能使用atomic
.
代码用g ++编译,没有任何警告(-Wall -Wextra
).
我的问题是:我是否误解了C++的"参考类型"的标准或概念?或者大多数编译器都会编译这段代码,因为否则使用atomic
会受到严重限制(基本上堆上没有数据可能是目标atomic
,因为你总是需要一个引用或一个解引用的指针)?
引用类型不是标量类型.但是,这个事实与你的问题无关.一个重要的事实是,计算结果为标量类型的引用的表达式是与标量类型的左值.具体而言,变量 reference
具有类型,int&
但表达式 reference
具有类型int
和值类别lvalue.所以,是的,您的计划符合要求.
归档时间: |
|
查看次数: |
396 次 |
最近记录: |