标签:指针 south c++ prot rtu val luci 用途 复制
我们把这样的程序方法称为“程序性的”。比如。我们声明一个 struct Point3d:
typedef struct _Point3d
{
float x;
float y;
float z;
} Point3d;
|
void Point3d_print( const Point3d* pd )
{
printf("(%g, %g, %g)", pd->x, pd->y, pd->z);
}
//%g和%G是实数的输出格式符号。它是自己主动选择%f和%e两种格式中较短的格式输出。而且不输出数字后面没有意义的零。
|
class Point
{
public:
Point( float x = 0.0 ) : _x(x) {}
float x() { return _x; }
void x( float val ) { _x = val; }
// ...
protected:
float _x;
};
class Point2d : public Point
{
public:
Point2d( float x = 0.0, float y = 0.0 ) : Point( x ), _y( y ) {}
// ...
protected:
float _y;
}
class Point3d : public Point2d
{
public:
Point3d( float x = 0.0, float y = 0.0, float z = 0.0 ) : Point2d( x, y ), _z( z ) {}
// ...
protected:
float _z;
}
|
后面你将看到,C++ 在布局和存取时间上基本的负担 是由 virtual 引起的。包含 虚函数 以及 虚基类。
2种成员变量(class data members):静态的(static) 和 非静态的(non-static);
3种成员函数(class member functions):静态的、非静态的 和 虚拟的(virtual)。
|
class Point
{
public:
Point( float valx );
virtual ~Point();
float x() const;
static int PointCount();
protected:
virtual ostream& print( ostream &os ) const;
float _x;
static int _point_count;
};
|
通常这个指针被称为 vptr。
vptr 的设定和重置都有每个 class 的 构造函数、析构函数、拷贝以及复制运算符。每个 class 所关联的 type_info object( 用以支持 runtime type identification, RTTI )也经由 virtual table 被指出来,一般是放在表格的第一个 slot 处。
class Base
{
public:
Base();
~Base();
};
// sizeof(Base) = ?
|
class Base
{
public:
Base();
~Base();
protected:
double m_Double;
int m_Int;
char m_BaseName;
};
// sizeof(Base) = ?
|
第一题: 答案是1。
class Base 里仅仅有构造函数和析构函数,由前面的内容所知,class 的 member functions 并不存放在 class 以及事实上例内,因此,sizeof(Base) = 1。是的,结构不是0,而是1,原因是由于,class 的不同实例,在内存中的地址各不同样,一个字节仅仅是作为占位符,用来给不同的实例分配不同的内存地址的。
第二题:答案是16。
double 类型的变量占用8个字节。int 占了4个字节,char 仅仅占一个字节。但这里它会按 int 进行对齐,Base 内部会填补3个字节的内存大小。
最后的大小就是 8 + 4 + 1 + 3 = 16。 大家能够调整三个成员变量的位置,看看结果会有什么不同。
|
Base* p_Base;
int* p_Int;
vector<string> * p_vs;
|
比方:一个指向 int 的指针,如果其地址是 1000。在32位及其上。将涵盖地址空间 1000~1003.
标签:指针 south c++ prot rtu val luci 用途 复制
原文地址:http://www.cnblogs.com/jzdwajue/p/7249651.html