标签:
杂谈 |
周末了,
[
场景一]
老师:老实说,你吸烟吗?
男生 a :不吸。
老师:不吸?嗯,吃根薯条吧。
男生 a 很自然地伸出两根手指夹着接过来……
老师:不吸?!叫家长来……
[
场景二 ]
老师 : 吸烟吗?
男生 b: 不吸。
老师:不吸?嗯,吃根薯条吧。
b 由于听到a 的情况,所以很小心的用手掌接过了薯条。
老师:不蘸点番茄酱吗?
b 一不小心蘸多了,于是马上用手指弹了弹……
老师:弹烟灰的姿势很熟练嘛。叫家长来……
在网上看到很多朋友对Shallow Copy,Deep Copy,Bitwise Copy和Memberwise Copy这4者之间的关系的理解多有混淆,Stanley Lippman的“Inside the C++ Object Model”的讲解也比较晦涩难懂,玄机逸士在此来一个简单的、明确的说明:)
Java中的Clone也有浅克隆和深克隆之分,分别对应C++中的浅拷贝和深拷贝。
Shallow Copy = Bitwise Copy,Deep Copy = Memberwise Copy.
Long story short, a shallow copy only copies the binary, in memory, print of a class. A deep copy “dives into” the members, and copy their logical data. Usually, by default, it is a Shallow/Bitwise copy.
下面
请参考:http://blog.sina.com.cn/s/blog_5f5fff010100cu9w.html
一个类的对象到底有多大?其大小由什么因素影响?
我们假定这个类没有继承任何其他类,且没有虚函数。先看下面例子:
#include <iostream>
using namespace std;
class Concrete
{
public:
前篇:http://blog.sina.com.cn/s/blog_5f5fff010100cwpu.html
下面讨论虚基类和虚函数同时存在的时候,对对象内存布局的影响。
假定各个类之间的关系如下图:
Base中声明了一个虚函数vfBase()和一个整形成员变量;
Derived1 override
前篇:http://blog.sina.com.cn/s/blog_5f5fff010100cwpo.html
和对象内存布局 (14)差不多,只是改动了两个继承关系。几个类的继承关系如下图,这种继承方式不是很有实际意义,在此纯粹是探究类的memory layout。
前篇:http://blog.sina.com.cn/s/blog_5f5fff010100cwpj.html
继续探讨虚基类对对象内存布局的影响。几个类的继承关系如下图,这是虚基类最为常见的用法之一:
代码如下:
#include <iostream>
前篇:http://blog.sina.com.cn/s/blog_5f5fff010100cwh2.html
下面来看看虚基类对对象内存布局的影响。虚基类的主要作用就是在所有的派生类中,保留且仅保留一份虚基类的suboject。
a. 一个虚基类的情况
#include <iostream>
using namespace std;
class Base
{
前篇:http://blog.sina.com.cn/s/blog_5f5fff010100cwfd.html
注意:关于内存对齐(memory alignment),请看关于内存对齐问题,后面将会用到。
下面我们进行在普通继承(即非虚继承)时,派生类的指针转换到基类指针的情形研究。假定各
前篇:http://blog.sina.com.cn/s/blog_5f5fff010100cw96.html
在C++中,一个类实例化得到的结果就是一个对象。一个类包含成员变量和成员函数,其中成员变量又分为nonstatic成员变量和static成员变量;成员函数又可以分为nonstatic成员函数、static成员函数以及virtual成员函数。一个对象包含可能存在的vfptr以及它声明的或基类继承而来的nonstatic成员变量,static成员变量、static成员函数、nonstatic成员函数以及virtual函数均存在于对象之外。
VC2005中有一个非常重要的编译选项:
对于查看类的对象的内存布局,微软内部在VC2005中(要先进入Microsoft Visual Studio -> Visual Stu