Thursday, June 6, 2013

BLOG接入公益404

无意中看到了自己的404页面,空荡而生硬,联想到了浩哥的404,咱也公益一把,也算是近点微薄之力。


虽然希望渺茫,但是希望这些娃能过得幸福,即使不在亲生父母身边,幸福是最重要的。


公益404

公益404



公益404接入地址:http://www.qq.com/404/






via WordPress http://www.econsh.com/2013/06/blog%e6%8e%a5%e5%85%a5%e5%85%ac%e7%9b%8a404/?utm_source=rss&utm_medium=rss&utm_campaign=blog%25e6%258e%25a5%25e5%2585%25a5%25e5%2585%25ac%25e7%259b%258a404

Wednesday, June 5, 2013

this指针是非左值的表达式

闲逛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。


参考文献



  1. Where is the ‘this’ pointer stored in computer memory?

  2. 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