在《深入探索C++对象模型》中,谈到声明的顺序时候说到, 声明变量的顺序和他们实际在内存的排列顺序是可以不一致的,但是大多数编译器实现都一致, 基本上是按照其声明的顺序而排列的。
并且给出下面这段代码 来比较任意两个成员的排列顺序。
书中的代码 在vs系列里面 编译不过,我改了一下 ,没有问题。 下面是实例代码
#include <cstdlib>
class A
{
public:
int a;
public:
int b;
public:
int c;
public:
void set(int a, int b, int c)
{
this->a = a;
this->b = b;
this->c = c;
}
};
template <class class_type, class data_type1, class data_type2>
char * access_order(data_type1 class_type::*mem1, data_type2 class_type::*mem2 )
{
return *((int *)&mem1) < *((int *)&mem2) ?"member 1 first" : "member 2 first";
}
int _tmain(int argc, _TCHAR* argv[])
{
printf("%s", access_order( &A::c, &A::b));
system("pause");
return 0;
}
这本书 大多数是从汇编的角度去分析 编译器对C++的实现。 和C++ primer 书中的说法 有些人 认为是不同的,但是实际上, 后者是从语法本身去看待问题,而 对象模型 则是从编译器实现上。