使用visual studio命令提示查看C++内存布局
来自对《深度探索C++对象模型 侯捷译》的一点总结、体会。
Only one reason,静态成员函数没有this指针,不与类的实例(对象)“挂钩”。
那么const volatile virtual这些限定是如何通过this指针发挥功能的呢?
通过例子说明:
1) 基础:何为this指针?它有什么用?
this指针指向类的某个实例(对象),叫它当前对象。
class A
{
int i;
void foo ( ){
i++;
}
};
void A::foo ( ); 会被编译器转化为一个外部的、非成员的、普通的函数:(实际的函数名还会包含类名与形参的编码,以区分不同的类和重载,但这里为了简单,仍用foo)
void foo ( A * this ){ // 严格的形式应是A * const this
(this->i)++;
}
相应地,
A bar;
bar.foo(); 会被编译器转换为:foo( &bar ); // 没考虑对函数名的特殊处理(见上),下同
拓展,另一个带返回值的函数例子:
class A
{
int i;
int foo ( ){
i++;
return i;
}
}bar ;
会变成:void foo ( A * this, int & result ){
}(this->i)++;
result = this->i;
return;
int a = bar.foo(); 会变成 foo( &bar, a);
如果直接调用bar.foo(),会有临时变量,不考虑代码优化。
“返回值为引用类型”跟“返回值为指针类型”的道理是一样的,引用在必要的时候是通过指针(常量指针 type * const,所以引用必须初始化,而且自始至终都代表那一个变量 ) 实现的,二者在编译器的汇编(机器指令)实现机制是一样的。“不要返回局部对象的指针(地址值)”,同理不要返回局部对象的引用。C++是面向对象的高级语言,however,本书的作者Lippman认为了解C++的实现机理对于中高级C++程序员来说是必需的。如果不知道编译器对你的代码做了什么,那么代码的效率永远都是未知数。嵌入式、硬件开发的厉害C程序员看一眼C代码,甚至都知道它在目标平台上的汇编是什么样的。这种C语言与汇编的关系,使得C语言适合某些嵌入式、驱动、操作系统等底层开发。虽然C++的设计者想在语言层面对程序员做透明化处理(比如引用),但是面对以“保证效率和兼容C的情况下提供OO”为设计目标的C++,程序员还是了解一下底层为好。
2)多态与虚函数
virtual void foo () {}
void foo () {}
void foo () {}
3)const对象与const成员函数
4)volatile对象与volatile成员函数
5) static
#include <iostream>
#include <thread>
using namespace std;
class Foo{
public:
void bar( int i ) {
cout << "id: " << i << endl;
};
};
int main(int argc, char* argv[])
{
Foo a;
thread t(&Foo::bar, &a, 1); // 对比编辑器对类的成员函数的处理
t.join();
return 0;
}