请考虑以下陈述
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也是如此:
标识符是一个id表达式,只要它已被适当声明(第7条).[..]
[..]结果是由标识符表示的实体.如果实体是函数,变量或数据成员,则结果是左值,否则为prvalue.
[..]
一元*运算符执行间接:它所应用的表达式应该是指向对象类型的指针,或指向函数类型的指针,结果是指向表达式指向的对象或函数的左值.
我用clang ++ 3.2-11和g ++ 4.7.3尝试了这个,第一个用C++ 11模式产生三个读取,在C++ 03模式下产生零读取(输出三个警告),而g ++只产生前两个,显式警告我不会生成第三个.
很明显,从标准中的引用行中,哪种类型的值来自表达式,但是:
根据C++标准,哪些语句(A,B,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)