首页 > 试题广场 >

下面代码cout的输出结果是: #include &l...

[单选题]
在 32 位机器上,对齐模数为 8,下面代码的输出结果是:
#include <iostream>
using namespace std;

class A {
    virtual void func() { 
        cout << "func" << endl; 
    }
    float f; char p; int adf[3];
};

int main() {
    cout << sizeof(A);
    return 0;
}
  • 8
  • 17
  • 20
  • 24
class A{
  virtual void func(){
      cout<<"func"<<endl;
  }  
    
  float f;
  char p;
  int adf[3];
};
假设是在32bit系统下,指针大小为4字节。
类A中存在虚函数,因此在对象的内存空间中,首先有1个指针指向虚函数表(VTABLE),指针占4字节;
float f;占4字节;
char p;占1字节,但是由于内存对齐,下一个变量相对于对象起始位置的偏移量得是4的整数倍,所以补3个字节;
int adf[3];占3*sizeof(int)=12个字节。
一共占24个字节。
发表于 2020-10-05 11:17:22 回复(3)
抄一下作业
64位操作系统,不同类型变量对应的字节数为:(红色的表示与32位系统不同之处)
        char :1个字节 
      char*(即指针变量): 8个字节 
      short int : 2个字节 
      int:  4个字节 
      unsigned int : 4个字节 
      float:  4个字节 
      double:    8个字节 
      long:   8个字节 
      long long:  8个字节 
      unsigned long:  8个字节 
64位系统在内存管理方面遵循8字节对齐,原则:在8字节对齐的情况下,按8个字节为单位分配存储空间,如果不足,会自动补充,本次分配不足以存放下面的变量时,会重新分配空间。
structA{
   unsigned int a; //对于开始连续的第一个8字节内存,a占4字节 
   char b[2];      //b[]占1*2字节,在a后的连续2字节内存放,还剩2个字节,
   double c;       //c占8字节,第一个8字节还剩2字节不足以存放c,自动补充该2字节。并同时开辟第二个8字节内存存放c
   short d;        //d占2字节,开辟第三个8字节,存放d。剩余的6个字节补齐。故总共开辟了8*3=24字节存放该数据结构
}
相同的题型,可以理解一下
发表于 2023-06-27 18:09:24 回复(0)
注意这道题如果没有注意虚函数也是24,但是虚函数指针是四个字节,不能忽略这个东西
发表于 2023-10-12 20:03:54 回复(0)
虽然是32位,但你指出对齐模数是8,结果怎么可能是24,真醉了,这种题能不能别出!!!!
发表于 2023-11-29 18:43:19 回复(0)
假设是在32bit系统下,指针大小为4字节。
类A中存在虚函数,因此在对象的内存空间中,首先有1个指针指向虚函数表(VTABLE),指针占4字节;
float f;占4字节;
char p;占1字节,但是由于内存对齐,下一个变量相对于对象起始位置的偏移量得是4的整数倍,所以补3个字节;
int adf[3];占3*sizeof(int)=12个字节。
一共占24个字节。
重点理解一下字节对齐的含义。
发表于 2022-06-13 14:15:29 回复(0)
32位系统下:

class A 
 {
 virtual void func(){ cout<< “func”<< endl;}      //占4个字节,这里的这个是虚函数,如果是62位的就为8字节,把他看做为指针变量
 float f; //占4个字节
char p; //占4个字节
int adf[3];//每个元素占4个字节,所以相当于有3个int型变量   int adf0;   int adf1;   int adf2;这里是数组,所有的元素都应该计算,并不是仅仅只是前面的数据类型就好了。
 };

所以按照结构体对齐原则按4字节对齐:4+4+4+4+4+4 = 24
发表于 2022-05-08 15:10:52 回复(0)
首先理解虚函数有个虚函数表指针,然后对齐,那么有, 4+4+4(1+3,3是对齐4而来的)+12=24 补充一下,与类大小有关因素,普通成员变量,虚函数,继承; 与类大小无关,静态成员变量,静态成员函数及普通成员函数~
编辑于 2021-03-26 17:48:20 回复(3)
32位系统下:

class A 
 {
 virtual void func(){ cout<< “func”<< endl;}      //占4个字节
 float f; //占4个字节
char p; //占4个字节
int adf[3];//每个元素占4个字节,所以相当于有3个int型变量   int adf0;   int adf1;   int adf2;
 };

所以按照结构体对齐原则按4字节对齐:4+4+4+4+4+4 = 24
发表于 2020-08-06 21:25:03 回复(2)