首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

《深入理解C++对象模型》上的有关问题,多谢

2012-04-05 
《深入理解C++对象模型》上的问题,谢谢。作者在第三章开头处给出了一个例子:classX{}sizeofX给出的结果是1。

《深入理解C++对象模型》上的问题,谢谢。
作者在第三章开头处给出了一个例子:
class   X{};

sizeof   X   给出的结果是1。
紧接着,作者在下面的论述中提出padding,可是这个地方为什么没有padding呢?为什么结果不是对齐以后的大小呢?谢谢各位。

[解决办法]
这里没有成员需要对,而struct本身,由于是空的,更是“永远都是对齐的”——因为你访问不到它的任何成员,于是你也就没法证明它在某个时刻没有对齐
(要证明一个struct没有对齐,只需要找出它的一个成员,并找到一种情况,使得这个成员没有被对齐到应该对齐的地址上即可。可是对于空struct,你找得到这样一个成员吗?找不到,所以你不能说人家没对齐。)
[解决办法]
至于 空结构的大小为什么是 1 有很多原因

空本来应该是 0, 但这样会有问题

比如

struct A{};

A a[10];

A* p = a;

p++; // 如果大小是0这个就永远不能往后移了


还有

在C++里面,我要知道两个对象是不是相等,我用operator==。如果我要知道两个指针/引用是不是指向同一个对象,我就比较他们的地址。所以说,任何可以被独立声明的类的长度至少是1


。。


1 是 pc上最小的数据大小单位了 (int a : 1 这种不算一个数据,不能独立存在)
[解决办法]
padding的目的是效率。
例如字长是4,下面的结构:
struct PADDING_SAMPLE
{
short s;
long l;
} ps;

short是2字节,long是4字节。CPU一次可以从%4==0的地址起始读4字节(字长)。
如果不做padding,ps.l的起始地址%4==2了,这样要访问ps.l时,CPU就必须读2次,造成效率损失。所以,需要padding,以空间换取时间。
而空的对象不存在被字长截断的问题,因此不需要padding.
[解决办法]
“那这个class如果是一个纯虚类,里面声明了几个虚函数,而没有任何成员变量,sizeof应该产生什么呢?谢谢。”


应该是4, 书里面说的很清楚了, 当没有任何成员变量和虚函数时,大小是1.

当没有任何变量,只有虚函数时,vptr将存在,而此时原来的那1个字节被去掉所,以大小是4

热点排行