相关疑难解决方法(0)

涉及带有volatile变量的表达式的简单语句的正确行为?

请考虑以下陈述

volatile int a = 7;
a;   // statement A
volatile int* b = &a;
*b;  // statement B
volatile int& c = a;
c;   // statement C
Run Code Online (Sandbox Code Playgroud)

现在,我一直试图在标准中找到一个点,告诉我编译器在遇到这些语句时的行为方式.我能找到的只是A(可能是C)给我一个左值,B也是如此:

"§5.1.1.8主要表达 - 一般"说

标识符是一个id表达式,只要它已被适当声明(第7条).[..]
[..]结果是由标识符表示的实体.如果实体是函数,变量或数据成员,则结果是左值,否则为prvalue.
[..]

"§5.3.1一元运营商"说

一元*运算符执行间接:它所应用的表达式应该是指向对象类型的指针,或指向函数类型的指针,结果是指向表达式指向的对象或函数的左值.

clang和gcc

我用clang ++ 3.2-11和g ++ 4.7.3尝试了这个,第一个用C++ 11模式产生三个读取,在C++ 03模式下产生零读取(输出三个警告),而g ++只产生前两个,显式警告我不会生成第三个.

很明显,从标准中的引用行中,哪种类型的值来自表达式,但是:
根据C++标准,哪些语句(A,B,C)应该从易失性实体中产生读取?

c++ standards volatile language-lawyer

9
推荐指数
2
解决办法
564
查看次数

C++中忽略了易失性说明符

我是C++的新手,最近我遇到了一些关于变量意味着什么的信息volatile.据我所知,这意味着对变量的读取或写入永远不会被优化.

然而,当我声明一个volatile不是1,2,4,8字节大的变量时会出现一种奇怪的情况:编译器(启用了C++ 11的gnu)似乎忽略了volatile说明符

#define expand1 a, a, a, a, a, a, a, a, a, a
#define expand2 // ten expand1 here, expand3 to expand5 follows
// expand5 is the equivalent of 1e+005 a, a, ....

struct threeBytes { char x, y, z; };
struct fourBytes { char w, x, y, z; };

int main()
{
   // requires ~1.5sec
   foo<int>();

   // doesn't take time
   foo<threeBytes>();

   // requires ~1.5sec
   foo<fourBytes>();
}

template<typename T>
void …
Run Code Online (Sandbox Code Playgroud)

c++ volatile c++11

1
推荐指数
1
解决办法
334
查看次数

标签 统计

c++ ×2

volatile ×2

c++11 ×1

language-lawyer ×1

standards ×1