首页 > 试题广场 >

在64位系统中,有如下类,那么sizeof(C)的数值是?

[单选题]
在64位系统中,有如下类:
class C
{
public:
    char a;
    static char b;
    void *p;
    static int *c;
    virtual void func1();
    virtual void func2();
};

那么sizeof(C)的数值是()
  • 9
  • 17
  • 32
  • 24
推荐
应该是D
sizeof(类)计算的是类中存在栈中的变量的大小,而类中的b和*c都是static静态变量,存在全局区中,因此不在计算范围之内,于是只剩下char a,void *p和两个virtual虚函数,a是char类型,占用一个字节,p是指针,在64位系统的指针占用8个字节,而两个虚函数只需要一个虚函数表指针,也是八个字节,加上类中的对齐方式(char a对齐时后面补上7个字节),故答案为24.
编辑于 2015-12-05 11:21:51 回复(18)
jdk头像 jdk
C
发表于 2015-01-12 16:48:32 回复(0)
虽然大家选的D,但是看分析居然很不一样。。首先需要明确几点:
1 sizeof是用来计算栈大小,不涉及全局区,故类的静态成员大小sizeof不涉及。
2 本题中的虚函数属于同一个类,故只需要一个指针指向虚函数表,所以在64位系统中占用8个字节。就算本题有100个虚函数,那么也只占用8个字节。
综上,占用栈空间的成员有:a, p, func1, func2,由于64位对其,故总空间为8+8+8=24字节。
发表于 2015-08-23 21:21:03 回复(6)
1 类与结构一样,都有字节对齐的问题
2 类中普通的函数不占用类的大小
3 类中虚函数占用一个地址位宽(4或8字节),且不论有多少个虚函数一共只占这么多
4 类中常量不占用类大小: const static /   enum{aa=2,bb=4};
5 类中static修饰的变量不占用类大小,因为修饰后存储在静态区域
6 子类的大小等于子类新增的加上父类的大小
编辑于 2015-09-13 21:37:23 回复(3)
应当是24.考虑内存对齐,则char c占8个字节,void *指针占8字节,有虚函数,则虚表指针8字节,static 成员不在对象内部,因此为24
发表于 2015-03-29 21:42:20 回复(0)
题目本身有问题,有重复的变量b,不过不影响。
类的静态成员变量不占用类对象的空间;
变量a后面还有变量b,因此变量a后面有7个字节的空闲空间;
有虚函数,虚函数表的指针需要占用1个字节的空间,位于变量a的上一个字节。

选D
编辑于 2015-12-05 11:20:53 回复(2)
关键在于静态变量存在全局区中,不进行计算。虚函数只需要一个虚函数表指针。而类中需要对齐,所以24字节
编辑于 2016-06-09 16:39:16 回复(0)
没问题就是24,类里面的虚构函数不管是几个都只占用一个字节,静态成员不占用类里面的空间,静态成员只是在这里声明,再根据类的对齐方式,所以就是24了
发表于 2022-07-29 08:56:37 回复(0)
D.    static 不能算 ,  64bit 指针8字节,两个虚函数只有一个地址,就是3,4,5个都一样 ..所以 就是 8 + 8 + 8 = 24
编辑于 2015-04-14 22:37:03 回复(0)
补充一下,欢迎拍砖。普通函数不占用空间,const占用空间,所谓对齐应该是和结构体最宽的元素对齐
发表于 2017-12-16 20:44:19 回复(0)
在64位系统中,类 `C` 的大小计算需综合考虑内存对齐和虚函数表指针的占用,具体分析如下: --- ### **关键分析步骤** 1. **虚函数表指针(vptr)** 类中包含两个虚函数(`func1` 和 `func2`),这会为类添加一个 **虚函数表指针(vptr)**。 - 在64位系统中,指针大小为 **8字节**。 2. **非静态成员变量** - `char a`:占 **1字节**。 - `void *p`:指针类型,占 **8字节**。 - **静态成员变量**(`static char b` 和 `static int *c`)不占用类实例的内存空间。 3. **内存对齐规则** - 结构体的总大小必须是 **最大成员对齐值的整数倍**。 - 在64位系统中,指针的对齐值为 **8字节**,`char` 的对齐值为 **1字节**。 - 虚表指针(vptr)和 `void *p` 均需按 **8字节对齐**。 --- ### **内存布局计算** 1. **虚表指针(vptr)** - 起始地址 `0`,占用 `0-7` 字节(共8字节)。 2. **char a** - 起始地址 `8`,占用 `8` 字节(1字节)。 - 下一个成员 `void *p` 需按8字节对齐,因此需要在 `char a` 后填充 **7字节**(地址 `9-15`)。 3. **void *p** - 起始地址 `16`,占用 `16-23` 字节(8字节)。 4. **总大小** - 虚表指针(8字节) + `char a`(1字节) + 填充(7字节) + `void *p`(8字节) = **24字节**。 - 最终对齐验证:24是最大对齐值(8字节)的整数倍,符合要求。 --- ### **错误答案分析** 若认为结果为 **32字节**(选项C),可能因以下误解导致: 1. 误认为虚表指针后每个成员均需独立对齐到8字节,导致错误填充。 2. 未正确理解静态成员不占用类实例空间。 --- ### **最终答案** **正确答案:D. 24** **核心结论**: - 虚表指针(8字节) + `char a`(1字节) + 填充(7字节) + `void *p`(8字节) = 24字节。 - 静态成员不参与计算,内存对齐是关键。
发表于 2025-02-14 00:20:58 回复(0)
考虑字节对齐,4或者8的倍数
编辑于 2023-09-25 14:25:38 回复(0)
发表于 2022-03-19 11:45:16 回复(0)
为什么两个虚函数只需要一个虚函数表指针?
发表于 2021-06-08 22:32:30 回复(0)
sizeof用来计算栈的大小,不涉及全局变量(static属于全局变量) 两个同类型虚函数只需要一个虚函数指针。 即为计算 char a ,void *p,还有一个虚函数指针所占的字节 在64位系统中,为8(需要进行对齐)+8+8 在32位系统中,为4(需要进行对齐)+4+4
发表于 2020-11-02 15:44:34 回复(0)

(1)static不占据内存大小,首先排除。
(2)64位系统下指针长度变为8,32位系统下指针长度为4.
(3)类C的长度和一个char类型,一个void指针,一个虚函数表指针有关。尽管有两个虚函数,但它们存储在虚函数表指针指向的虚函数表中。
(4)根据结构体的对齐原则,3*
8=24。即变量a实际上占用了8个字节空间。

编辑于 2020-06-10 21:15:57 回复(0)
注意64位系统,指针占8个字节!!!
发表于 2019-07-10 09:16:27 回复(0)

在同一个类中的虚函数占用一个地址的内存


发表于 2018-11-28 19:39:23 回复(0)
sizeof(类) 计算的是类中存在栈中变量的大小,b和*c是静态变量,存在全局区中;
对于虚函数,无论多少个,只要一个虚函数表指针即可;
发表于 2018-07-18 21:21:27 回复(0)
sizeof(类)计算的是类中存在栈中的变量的大小,而类中的b和*c都是static静态变量,存在全局区中,因此不在计算范围之内,于是只剩下char a,void *p和两个virtual虚函数,a是char类型,占用一个字节,p是指针,在64位系统的指针占用8个字节,而两个虚函数只需要一个虚函数表指针,也是八个字节,加上类中的对齐方式(char a对齐时后面补上7个字节),故答案为24.
sizeof:不计算一般函数,static静态变量;
        64位,指针占8个字节,虚函数表指针也是8个字节
发表于 2017-10-01 22:56:08 回复(0)
考虑到对齐,static存放在全局区域,指针的大小和计算机的位数,虚函数占用空间......
得到8+8+8=24
发表于 2017-09-05 10:03:06 回复(0)