闲逛statckoverflow,有个问题是this指针到底是存在哪里的,栈,堆,还是代码段中?
this表达式
下面有个哥们给出了比较权威的解释:
C++ ISO的规范里面说
In the body of a nonstatic (9.3) member function, the keyword this
is a non-lvalue expression whose value is the address of the object for which the function is called.
值得注意的是this并不是一个变量,它是一个表达式,就像1+2一样。而表达式的值可以存在任何地方,栈,寄存器,堆等,具体取决于编译器。即this是一个值为指针的表达式。
lvalue和rvalue
看到了non-lvalue的时候我自然就想到不就是rvalue么,也不知道为啥这么说,为了了解为何这么说(还是木有了解,可能是习惯?),又去看了下lvalue和rvalue,来自51CTO的一篇文章解释的不错,摘抄如下。
术语 “L-Values” 和 “R-Values” 是很容易被搞混的,因为它们的历史渊源也是混淆。他们最初起源是编译器的设计者,从字面上来理解就是表达式左边的值和表达式右边的值。它们的含义一直在演化而名字却没变,现在已经“名”不副“实”了。虽然还是称为left-value 和right-value,但是他们的含义已经大大不同了。
C++ 03 标准上是这样写的: “每一个表达式要么是一个 lvalue,要么就是一个 rvalue。”
记住,lvalue和rvalue是针对表达式而言的。
lvalue 是指那些单一表达式结束之后依然存在的持久对象。例如: obj,*ptr, prt[index], ++x 都是 lvalue。
rvalue 是指那些表达式结束时(在分号处)就不复存在了的临时对象。例如:1729 , x + y , std::string(“meow”) , 和 x++ 都是 rvalue。
++x 和 x++ 的区别的语义上的区别: 当写 int i = 10 ; 时, i 是一个 lvalue,它实际代表一个内存里的地址,是持久的。 表达式 ++x 也是一个 lvalue,它修改了 x 的值,但还是代表原来那个持久对象。但是,表达式 i++ 却是一个 rvalue,它只是拷贝一份i的初值,再修改i的值,最后返回那份临时的拷贝,那份拷贝是临时对象。 ++i 和 i++ 都递增i,但 ++i 返回i本身,而 i++ 返回临时拷贝。这就是为什么 ++i 之所以是一个 lvalue,而 i++ 是一个 rvalue。
lvalue 与 rvalue 之分不在于表达式做了什么,而在于表达式代表了什么(持久对象或临时产物)。 判断一个表达式是不是 lvalue 的直接方法就是“能不能对表达式取址?”,如果能够,那就是一个 lvalue;如果不能,那就是一个 rvalue。
参考文献
- Where is the ‘this’ pointer stored in computer memory?
- C++左值与右值之间共同与不同点解析
via WordPress http://www.econsh.com/2013/06/this%e6%8c%87%e9%92%88%e6%98%af%e9%9d%9e%e5%b7%a6%e5%80%bc%e7%9a%84%e8%a1%a8%e8%be%be%e5%bc%8f/?utm_source=rss&utm_medium=rss&utm_campaign=this%25e6%258c%2587%25e9%2592%2588%25e6%2598%25af%25e9%259d%259e%25e5%25b7%25a6%25e5%2580%25bc%25e7%259a%2584%25e8%25a1%25a8%25e8%25be%25be%25e5%25bc%258f