首页 > 试题广场 >

根据描述回答问题。

[单选题]
若char是一字节,int是4字节,指针类型是4字节,代码如下:
class CTest
{
    public:
        CTest():m_chData(‘\0’),m_nData(0)
        {
        }
        virtual void mem_fun(){}
    private:
        char m_chData;
        int m_nData;
        static char s_chData;
};
char CTest::s_chData=’\0’;
问:
(1)若按4字节对齐sizeof(CTest)的值是多少?
(2)若按1字节对齐sizeof(CTest)的值是多少?
请选择正确的答案。
  • 16 4
  • 16 10
  • 12 9
  • 10 10
推荐
答案分别是:12 和 9,对应C

考察点:c++ 类的内存布局。

上精华图:一张图说明类中成员变量,成员函数,静态变量与函数的空间位置。



理论如上,下面就是代码运行后真是执行结果。无pp无真相。这是4字节对齐,结果是12= 4(虚表指针)+1(char )+3(对齐补位)+4(int)



以下是1字节对齐,结果是9 =4(虚表指针)+1(char )+4(int)


编辑于 2015-02-03 11:32:35 回复(20)
答案 :
若按4字节对齐sizeof(CTest)的值是12;
若按1字节对齐sizeof(CTest)的值是9
解释:

在类中,如果什么都没有,则类占用1个字节,一旦类中有其他的占用空间成员,则这1个字节就不在计算之内,如一个类只有一个int则占用4字节而不是5字节。

如果只有成员函数,则还是只占用1个字节,因为类函数不占用空间

虚函数因为存在一个虚函数表,需要4个字节,数据成员对象如果为指针则为4字节,注意有字节对齐,如果为13字节,则进位到16字节空间。

sizeof的本质是得到某个类型的大小,确切的来说就是当创建这个类型的一个对象(或变量)的时候,需要为它分配的空间的大小。而类也可以理解为类似于int、float这样的一种类型,当类中出现static成员变量的时候,static成员变量是存储在静态区当中的,它是一个共享的量,因此,在为这个类创建一个实例对象的时候,是无需再为static成员变量分配空间的,所以,这个类的实例对象所需要分配的空间是要排除static成员变量的,于是,当sizeof计算类的大小的时候会忽略static成员变量的大小

http://blog.csdn.net/ychtt/article/details/6548760
发表于 2015-01-09 16:51:00 回复(11)
注意点:
1 先找有没有virtual 有的话就要建立虚函数表,+4
2 static的成员变量属于类域,不算入对象中      +0
3 神马成员都没有的类,或者只有成员函数        +1
4 对齐法则,对大家都没有问题
发表于 2015-04-10 18:43:33 回复(7)
答案 :
若按4字节对齐sizeof(CTest)的值是12;
若按1字节对齐sizeof(CTest)的值是9
解释:
在类中,如果什么都没有,则类占用1个字节,一旦类中有其他的占用空间成员,则这1个字节就不在计算之内,如一个类只有一个int则占用4字节而不是5字节。

如果只有成员函数,则还是只占用1个字节,因为类函数不占用空间

虚函数因为存在一个虚函数表,需要4个字节,数据成员对象如果为指针则为4字节,注意有字节对齐,如果为13字节,则进位到16字节空间。

sizeof的本质是得到某个类型的大小,确切的来说就是当创建这个类型的一个对象(或变量)的时候,需要为它分配的空间的大小。而类也可以理解为类似于int、float这样的一种类型,当类中出现static成员变量的时候,static成员变量是存储在静态区当中的,它是一个共享的量,因此,在为这个类创建一个实例对象的时候,是无需再为static成员变量分配空间的,所以,这个类的实例对象所需要分配的空间是要排除static成员变量的,于是,当sizeof计算类的大小的时候会忽略static成员变量的大小
发表于 2021-12-02 08:56:39 回复(0)
1 虚函数表 占一个指针的空间 即 4 virtualvoidmem_fun(){}
2 charm_chData; 1 + 3 对齐  4 
3 intm_nData;           4
4  static的成员变量属于类域,不算入对象中 0 staticchars_chData;

虚函数表 占一个指针的空间 即 4  virtual   void   mem_fun(){}
2 char   m_chData;          1
3  int   m_nData;           4
发表于 2015-05-12 21:54:48 回复(4)
澈兮的总结很好,4个点几乎涵盖了计算类占用空间应注意的要点,结论到位但似乎少点原理,我来完善下: 
1.类中一旦有virtual修饰的成员函数,编译器会构建虚函数表,在该类的对象中会存放一个指向虚函数表的指针,在 32位机中该指针和其他指针一样占用4字节。 +4 
2.static作为静态变量是对类而言的,为所有对象共有,不计算对象的占用空间。 +0 
3.神马都没有或仅有非虚成员函数的类或仅有类型声明的类(如typdef),均为空类。对于空类,编译器会构造占用1字节空间的变量(通常为char型); +1 ;若该类为基类,则继承自空基类的子类不计算这1字节的空间,仅计算子类所占空间(编译器原理:空基类优化)。 +0 
4.对齐规则,如果注意了题目说明或代码开头的字节对齐宏:#pragma pack,对大家都没问题。
编辑于 2017-07-28 20:48:04 回复(0)
4字节对齐:
虚函数:0: 0~3
char     :4
int       :5,因为5不能被4整除,故推移为8,大小8~11
总大小为0~11 12个,可以被4整除,故为12

1字节对齐:
虚函数:0: 0~3
char     :4
int       :5~8
总大小为0~8 9个,可以被1整除,故为9

编辑于 2018-02-25 14:12:49 回复(1)
类的大小只与非static变量和虚函数指针有关
发表于 2015-05-14 17:22:06 回复(0)
虚函数需要虚函数表 4
char 需要 1
int 需要 4
static 0
共需要9
一字节对齐 9
四字节对齐 12
编辑于 2020-04-08 00:54:51 回复(0)
构造函数、成员函数(非虚函数时)和静态函数不占空间,成员变量、 虚函数 占空间。 http://blog.sina.com.cn/s/blog_69c189bf0100mkeu.html
发表于 2017-06-23 15:57:45 回复(1)
sizeof(类):
若类中含虚函数,就存在指向虚函数表的指针,4个字节;
静态数据成员,存储在全局数据区,而 sizeof()计算的是栈中变量所占字节;

发表于 2017-04-18 11:42:56 回复(0)
只要记住一句话就可以,对象所占用空间大小只与非static变量和虚表有关,再加上对齐规则,就能够知道答案是C
发表于 2016-08-04 11:33:07 回复(0)
类的静态数据成员不算在类的大小内
发表于 2016-03-15 19:51:03 回复(0)
静态成员不属于实例,如果按4B对齐需要(2+1)*4 ,虚函数表占用4个字节,两个类成员占用两个4B;如果不要求对齐,就是(1+4+4)B。
发表于 2021-07-12 10:56:21 回复(0)
静态成员不占内存空间,不算进去
发表于 2023-10-12 16:30:34 回复(0)
没学到,几乎没看懂
发表于 2022-07-18 14:33:40 回复(0)
4字节对齐 最小长度单位是4字节 不足就要补齐1字节对齐 最小长度单位是1字节 虚函数4字节 啥也没有1字节
发表于 2022-04-24 18:56:25 回复(0)
总共九个字节,4个字节对齐就变成了12了
发表于 2021-04-08 17:23:34 回复(0)
1.虚函数需要维护虚函数表,占四个字节 2.static位于静态内存区,事先就创建好了,所以计算类的大小的时候不算入。
发表于 2020-12-24 16:43:05 回复(0)
虚函数,占4字节 static变量,不占内存 其他成员函数,不占内存 指针变量,占4字节 若无以上,类本身占4字节,否则不占内存
发表于 2020-10-16 23:42:30 回复(0)
static是共享的所以不算static所占的空间大小
发表于 2020-09-10 20:06:33 回复(0)