首页 > 试题广场 >

在32位机器上,下列代码中 class A {

[单选题]
在32位机器上,下列代码中
class A  
 {  
      int i;  
      union U  
      {  
          char buff[13];  
          int i;  
      }u;  
      void foo() {    }  
      typedef char* (*f)(void*);  
      enum{red, green, blue} color;  
 }a;  

sizeof(a)的值是()


  • 20
  • 21
  • 22
  • 24
  • 非以上选项
推荐
联合表示若干数据成员取其一,故以叠加方式分配内存,所占字节数为最大数据成员所占的字节数。 还要字节对齐
空函数 不占字节
所以
4+16+0+0+4
编辑于 2015-02-04 18:12:43 回复(0)
答案:D
实例化class A
  1. int i占4个字节
  2. union U实例化为u占取16个字节(char数组占13个字节,但因为最大类型为int,所以占取只能为4字节的整数倍即最小16字节)
  3. 空函数不占取字节
  4. 未实例化指针不占取字节
  5. 枚举类型占取4个字节
总共占取4+16+4=24个字节
编辑于 2015-03-31 22:58:44 回复(10)
联合体
用途:使几个不同类型的变量共占一段内存(相互覆盖)
结构体是一种构造数据类型
用途:把不同类型的数据组合成一个整体-------自定义数据类型

结构体的内存分配:
结构体在内存中分配一块连续的内存,但结构体内的变量并不一定是连续存放的,这涉及到内存对齐。
原则1  数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。
原则2  结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储。)
原则3  收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。

联合的内存分配:
Union的大小为其内部所有变量的最大值,并且按照联合体中 类型 最大值的整数倍进行内存对齐:
union U 
      { 
          char buff[13]; 
          int i; 
      }u;
首先按照char buff[13]分配13个字节,然后按照int的4个字节对齐,最终sizeof(u2)=16; (大于等于13且能被4整除的最小的数,即16)
根据原则2,u在class内要从u内部 类型最大的整数的倍开始储存,本题就是从4开始存16个字节。这时已经是4+16=20

成员函数不管是否为空,都不会占用空间,因为是this指针调用,有虚函数时除外,vtbl(virtual table)和vptr(virtual table pointer)会多出一个指针

typedef 是声明,枚举则是int 实现.20+4=24
编辑于 2017-03-05 03:20:52 回复(2)
空函数是不占字节的,还有就是typedef只是一个声明而已,也不占字节;枚举类型是用int型实现的,故占4个字节;联合类型中字节数是12+4(有一位是'\0')故总共是4+16+4个字节。
答案选D
发表于 2014-11-14 17:04:34 回复(5)
未实例化的指针不占字节;
class中的成员和struct中的成员一样,分配空间的时候都需要对齐;
枚举类型只占一个int字节;

发表于 2017-09-22 10:05:59 回复(0)
虽然选对了,但是为什么我用VS运行的结果为20
发表于 2017-08-08 22:06:29 回复(3)
typrdef 只是定义类型,并不实例化任何变量,不占用内存。
成员函数既不占用类的存储,实例化后也不会占用对象的存储,只是多了个this指针参数用于操作对象成员。(如果是虚函数,则为4byte,用于存储vptr)
union的话以其中占用最多内存的变量为准,即13,内存对齐后即16.
enum记得是用int实现的,变量占用4个字节
int 变量占用4个字节
综上,占用空间为16+4+4=24
编辑于 2016-12-25 12:08:00 回复(0)
选D。 i占四字节,枚举类型占4字节,联合体类型占16字节,24
发表于 2014-11-09 14:23:32 回复(3)
/*************************************************************************
    > File Name: a.cpp
    > Author: 傻李
    > Mail: hellojukay@gmail.com 
    > Created Time: 2014年11月16日 星期日 11时36分41秒
 ************************************************************************/

#include<iostream>
using namespace std;

int main()
{
 class A
 {
 union u
 {
 char buffer[13];
 int i;
 }u;
 void foo(){}
 typedef char * (*f)(void*);
 enum{red,green,blue} color;
 }a;
 cout << sizeof(a);
 return 0;
}
20
发表于 2014-11-16 11:42:45 回复(3)
枚举类型和int类型都是占用4个字节
发表于 2019-10-26 18:01:23 回复(0)
空函数和声明都不占内存空间
发表于 2019-08-05 08:38:34 回复(0)
int i;//4个字节 union的长度取决于其中的长度最大的那个成员变量的长度。即union中成员变量是重叠摆放的,其开始地址相同。 其实union(共用体)的各个成员是以同一个地址开始存放的,每一个时刻只可以存储一个成员,这样就要求它在分配内存单元时候要满足两点: 1.一般而言,共用体类型实际占用存储空间为其最长的成员所占的存储空间; 2.若是该最长的存储空间对其他成员的元类型(如果是数组,取其类型的数据长度,例int a[5]为4)不满足整除关系,该最大空间自动延伸; union// 16个字节
发表于 2018-10-12 14:10:42 回复(0)
枚举类型占4字节
发表于 2018-09-12 21:15:52 回复(0)
实例化class A
  1. int i占4个字节
  2. union U实例化为u占取16个字节(char数组占13个字节,但因为最大类型为int,所以占取只能为4字节的整数倍即最小16字节)
  3. 空函数不占取字节
  4. 未实例化指针不占取字节
  5. 枚举类型占取4个字节
总共占取4+16+4=24个字节
发表于 2018-07-10 10:57:36 回复(0)
我有一个问题想问一下,求大佬解答:
结构体开始是int,后面联合体的大小是16。根据对齐原则,4并不是16的整数倍,4不应该补成16吗?那答案不应该是48吗?类似这样:
struct A
{
    int a;
    double b;
};
大小明显是16,按前面的分析就是4+8=12。所以小弟不是很清楚是不是联合体在计算的时候永远排在最前面。当初选的时候是把联合体看成16个char作对的,本来想看看解析有没有分析这个的,但是看上去貌似全是在凑答案的
发表于 2017-12-19 09:59:02 回复(1)
枚枚类型四个字节
发表于 2017-08-05 17:04:20 回复(0)
1、联合体的内存长度是最长的成员的长度,但是要字节对齐,最长的是char buff【13】,字节对齐后是16个字节
2、函数返回的是空值,因此sizeof是0
3、枚举类型是int类型所以是4
4、typedef这个没有弄清楚
typedef int c;
cout<<sizeof(c)<<endl;
这个输出为4,不知道为什么上面的为0?
发表于 2016-08-11 21:13:42 回复(3)
1,32位机器上,int占4个字节
2,u为union类型,占16个字节。(char型数组占13个字节,int占4个字节,所以占4字节的整数倍即16个字节)
3,空函数不占字节,只是一个声明
4,typedef,也是一个声明,不占字节
5,默认地,枚举类型的变量,占用的字节数同整数int。
发表于 2016-07-22 19:57:41 回复(0)
空间分配时,涉及字节对齐问题。
共用体变量的存储空间,要取最大类型的整数倍
此题中的typedef只是一个声明,不占用存储空间

枚举类型是用int类型实现的,故占用4个字节
发表于 2016-05-16 17:41:17 回复(0)
脑抽把typedef也算了
发表于 2015-11-24 16:08:24 回复(0)
24
发表于 2015-09-24 07:48:06 回复(0)