<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://www.mywiki.cn/Hovercool/index.php?action=history&amp;feed=atom&amp;title=Cpp%E4%B8%AD%E7%A9%BA%E7%B1%BB%E5%AE%9E%E4%BE%8B%E7%9A%84%E5%A4%A7%E5%B0%8F</id>
	<title>Cpp中空类实例的大小 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://www.mywiki.cn/Hovercool/index.php?action=history&amp;feed=atom&amp;title=Cpp%E4%B8%AD%E7%A9%BA%E7%B1%BB%E5%AE%9E%E4%BE%8B%E7%9A%84%E5%A4%A7%E5%B0%8F"/>
	<link rel="alternate" type="text/html" href="https://www.mywiki.cn/Hovercool/index.php?title=Cpp%E4%B8%AD%E7%A9%BA%E7%B1%BB%E5%AE%9E%E4%BE%8B%E7%9A%84%E5%A4%A7%E5%B0%8F&amp;action=history"/>
	<updated>2026-09-01T05:31:18Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://www.mywiki.cn/Hovercool/index.php?title=Cpp%E4%B8%AD%E7%A9%BA%E7%B1%BB%E5%AE%9E%E4%BE%8B%E7%9A%84%E5%A4%A7%E5%B0%8F&amp;diff=888&amp;oldid=prev</id>
		<title>2015年5月6日 (三) 12:31 Hovercool</title>
		<link rel="alternate" type="text/html" href="https://www.mywiki.cn/Hovercool/index.php?title=Cpp%E4%B8%AD%E7%A9%BA%E7%B1%BB%E5%AE%9E%E4%BE%8B%E7%9A%84%E5%A4%A7%E5%B0%8F&amp;diff=888&amp;oldid=prev"/>
		<updated>2015-05-06T12:31:57Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
#include&amp;lt;iostream.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class a {};&lt;br /&gt;
class b{};&lt;br /&gt;
class c:public a&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
virtual void fun()=0;&lt;br /&gt;
};&lt;br /&gt;
class d:public b,public c{};&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
cout&amp;lt;&amp;lt;&amp;quot;sizeof(a)&amp;quot;&amp;lt;&amp;lt;sizeof(a)&amp;lt;&amp;lt;endl;&lt;br /&gt;
cout&amp;lt;&amp;lt;&amp;quot;sizeof(b)&amp;quot;&amp;lt;&amp;lt;sizeof(b)&amp;lt;&amp;lt;endl;&lt;br /&gt;
cout&amp;lt;&amp;lt;&amp;quot;sizeof(c)&amp;quot;&amp;lt;&amp;lt;sizeof(c)&amp;lt;&amp;lt;endl;&lt;br /&gt;
cout&amp;lt;&amp;lt;&amp;quot;sizeof(d)&amp;quot;&amp;lt;&amp;lt;sizeof(d)&amp;lt;&amp;lt;endl;&lt;br /&gt;
return 0;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
程序执行的输出结果为：&lt;br /&gt;
&lt;br /&gt;
sizeof(a) =1&lt;br /&gt;
&lt;br /&gt;
sizeof(b)=1&lt;br /&gt;
&lt;br /&gt;
sizeof(c)=4&lt;br /&gt;
&lt;br /&gt;
sizeof(d)=8&lt;br /&gt;
&lt;br /&gt;
为什么会出现这种结果呢？初学者肯定会很烦恼是吗？&lt;br /&gt;
&lt;br /&gt;
类a，b明明是空类，它的大小应该为为０，为什么　编译器输出的结果为１呢？&lt;br /&gt;
&lt;br /&gt;
这就是我们刚才所说的实例化的原因（空类同样可以被实例化），每个实例在内存中都有一个独一无二的地址，为了达到这个目的，编译器往往会给一个空类隐含的加一个字节，这样空类在实例化后在内存得到了独一无二的地址．所以a，b的大小为１．&lt;br /&gt;
&lt;br /&gt;
而类c是由类a派生而来，它里面有一个纯虚函数，由于有虚函数的原因，有一个指向虚函数的指针（vptr），在３２位的系统分配给指针的大小为４个字节，所以最后得到c类的大小为４．&lt;br /&gt;
&lt;br /&gt;
类d的大小更让初学者疑惑吧，类d是由类b，c派生迩来的，它的大小应该为二者之和５，为什么却是８　　呢？这是因为为了提高实例在内存中的存取效率．类的大小往往被调整到系统的整数倍．并采取就近的法则，里哪个最近的倍数，就是该类的大小，所以类d的大小为８个字节．&lt;br /&gt;
&lt;br /&gt;
当然在不同的编译器上得到的结果可能不同，但是这个实验告诉我们初学者，不管类是否为空类，均可被实例化（空类也可被实例化），每个被实例都有一个独一无二的地址．&lt;br /&gt;
&lt;br /&gt;
类的大小与它当中的构造函数，析构函数，以及其他的成员函数无关，只与它当中的成员数据有关：&lt;br /&gt;
&lt;br /&gt;
１．为类的非静态成员数据的类型大小之和．&lt;br /&gt;
&lt;br /&gt;
２．有编译器额外加入的成员变量的大小，用来支持语言的某些特性（如：指向虚函数的指针）,但是指向实例(对象)本身的this指针不包含&lt;br /&gt;
&lt;br /&gt;
３．为了优化存取效率，进行的边缘调整．&lt;br /&gt;
&lt;br /&gt;
４　与类中的构造函数，析构函数以及其他的成员函数无关．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
参考资料：&lt;br /&gt;
&lt;br /&gt;
http://hi.baidu.com/weepingsnow/blog/item/1945513ee298d7240b55a94b.html&lt;/div&gt;</summary>
		<author><name>Hovercool</name></author>
	</entry>
</feed>