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

共用讨论一个技术有关问题:)

2012-02-20 
共用讨论一个技术问题:)#includeiostreamusingnamespacestdclassA{public:intx,y,zvoidfoo()const{cou

共用讨论一个技术问题:)
#include   <iostream>
using   namespace   std;
class   A{
public:
int   x,y,z;
void   foo()   const{
cout < < "A   Class " < <endl;
}
};

int   main(){

cout < <sizeof(A) < < "   Bytes   of   Class   A " < <endl;
A   a;
cout < <sizeof(a) < < "   Bytes   of   an   object   of   A " < <endl;
system( "PAUSE ");
return   0;
}

为什么都是输出12字节呢?(vs2005)

[解决办法]
我来帮助liehen8475重新发下吧:
sizeof(A)的值跟类中成员变量的定义顺序,预编译命??pragma pack(n)都有关系.windows默认??pragma pack(2)也就是类中的成员变量按2个字节对齐.楼主的类中定义了3个int型变量按2字节对齐结果自然就是12.
楼主可以做下面一个实??
class A
{
int a;
char b;
int c
char d;
};
这个时候默认对齐是两个字节a占4个字节没有问题,char b只有一个字节但要按2对齐所有c是从b后空一个字节开始存储.于是sizeof(A)就是12??
如果上面的代码加??pragma pack(4)结果就是16??
改变变量定义顺序也可能不同,楼主可以自己试下然后分析下.

希望对你能有帮助


为什么我发的都是乱码?
[解决办法]
谢谢iambic()帮我翻译,昨天回不了贴很郁闷。
上个帖子写的预编译是#pragma pack(n)。
现在在细致的讨论下类的存储,在class中成员变量按照顺序按照对齐要求在内存中排列,而普通成员函数在编译时是静态绑定,类调用时就象调用库函数一样,所以类空间中没有为普通成员函数分配空间,但是虚函数和纯虚函数是动态绑定的,编译时需要一个指针指向一个虚函数表,所以当类中有虚函数时,类的内存分配为 成员变量+虚函数表指针(4个字节,多个虚函数也只有一个该指针)。
[解决办法]
建议去看《深度探索C++对象模型》

热点排行