c++ sizeof()问题
k=size(char);//k=1是吧;classB{public:virtualintdisplay();private:chara;}k=sizeof(B);//k...
k=size(char);//k=1是吧;
class B{
public:virtual int display();
private:char a;}
k=sizeof(B);//k=8;
//如果只有char a;k=1;
网上看到说是字节对齐,本来9个字节大小的,结果由于对齐大小变成12,那么sizeof(char)就是1呢??
是不是4以下就是真实值,4以上就要对齐???
另外,空类sizeof就是1,怎么回事??
还有类里的普通函数不占空间,虚函数就要??
原来只有复合结构才有字节概念, 展开
class B{
public:virtual int display();
private:char a;}
k=sizeof(B);//k=8;
//如果只有char a;k=1;
网上看到说是字节对齐,本来9个字节大小的,结果由于对齐大小变成12,那么sizeof(char)就是1呢??
是不是4以下就是真实值,4以上就要对齐???
另外,空类sizeof就是1,怎么回事??
还有类里的普通函数不占空间,虚函数就要??
原来只有复合结构才有字节概念, 展开
7个回答
展开全部
函数在结构体里,或者说类里,就是指针,你这个应该是32位的,那么一个指针就是4个字节了,你只定义了一个函数,那么就是4个字节。
而定义个一个char,因为要字节对齐,所以,是8个字节。
你可以再定义一个函数,其实定义函数只是增加了一个函数指针,所以应该还是4个字节。
你最好自己验证一下。
而定义个一个char,因为要字节对齐,所以,是8个字节。
你可以再定义一个函数,其实定义函数只是增加了一个函数指针,所以应该还是4个字节。
你最好自己验证一下。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这些都是常识问题了。
首先sizeof 空类大小是1,这个很好理解,因为类可以为空,但它要在内存中存在,不占空间怎么存在呢?所以C++规定空类大小为1.
其次,如果类有虚方法,那么类将使用一个额外的虚表指针,所以大小会多一个指针的大小。
关于内存对齐的问题,这是为了内存访问的效率,还有就是硬件的要求。对齐的大小是可以设置的,如果你想了解对齐的细节,还是看看内存对齐方面的知识,挺复杂的。
首先sizeof 空类大小是1,这个很好理解,因为类可以为空,但它要在内存中存在,不占空间怎么存在呢?所以C++规定空类大小为1.
其次,如果类有虚方法,那么类将使用一个额外的虚表指针,所以大小会多一个指针的大小。
关于内存对齐的问题,这是为了内存访问的效率,还有就是硬件的要求。对齐的大小是可以设置的,如果你想了解对齐的细节,还是看看内存对齐方面的知识,挺复杂的。
追问
为什么sizeof(char)就不用对齐呢?
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在用sizeof求大小的时候,字节对齐的概念只对复合数据类型(类和结构体等)有效,因为复合数据类型才有数据类型的内存布局的概念,其余的都是实际占内存空间的大小。
虚函数占空间是因为类中存储了虚函数表指针,另外我觉得普通函数应该也是要占空间的,我米有实验过,你可以构造更复杂一点的类来实验看看
虚函数占空间是因为类中存储了虚函数表指针,另外我觉得普通函数应该也是要占空间的,我米有实验过,你可以构造更复杂一点的类来实验看看
追问
被证实类里面的普通函数是不占空间的,我也纳闷了,
不过类外的就占4个字节
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2012-07-18
展开全部
一个空类只占一个字节。
字节对齐是指最后所得的字节数必须是其中最大一个变量的字节的整数倍。
一个类中每个虚函数都会占用4个字节。
类中的变量都会占用字节数的。
关于字节对齐 用结构体举个例子:
struct stu
{
int num;
char sex;
char age;
}; 8个字节
struct stu
{
char sex;
int num;
char age;
}; 12个字节。
类中除了虚函数和变量外,其他都不占字节。
字节对齐是指最后所得的字节数必须是其中最大一个变量的字节的整数倍。
一个类中每个虚函数都会占用4个字节。
类中的变量都会占用字节数的。
关于字节对齐 用结构体举个例子:
struct stu
{
int num;
char sex;
char age;
}; 8个字节
struct stu
{
char sex;
int num;
char age;
}; 12个字节。
类中除了虚函数和变量外,其他都不占字节。
更多追问追答
追问
额,第二个结构体里面的应该是两个int一个char,,
追答
系统每次分配字节时都是按照一个 int 型来分配的,也就是说每次系统都会给一个int 依次给int型字节,不够就填充:比如 double型就要给两次int型。
第一次给一个int 型 4个字节 其中char 需要一个 还剩3个是空的 但是下面的是int num 需要四个 就不够了 所要要重新再给4个字节。这样就占了8个字节了
最后一次还是给一个int型 虽然只有一个char age 它还是占一个字节,剩余3个字节是空的。
总共3此就给了12个字节。
struct stu
{
char sex;
char i;
int num;
char age;
char j;
}; 也是12个字节。
struct stu
{
char sex;
double num;
char age;
}; 24个字节。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
怎么会是9了。你一个函数,得分配一个指针,4个字节。你一个char,1个字节,对其就是4个字节。总共就是8个字节啊。
追问
我是举个例子,比如有个类占9个字节的,由于对齐就要占12个了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询