首页 > 试题广场 >

在32位机器上,下列代码中 sizeof(a)的值

[单选题]

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


sizeof(a)的值是()


  • 20
  • 21
  • 22
  • 24
  • 非以上选项
推荐
int4,enum4,union14(因为pack(2)),总22
编辑于 2015-02-04 20:34:16 回复(12)
我来详细解释一下吧。
首先,#pragma pack(2)   强制设定为2字节对齐

i   4字节
u  一个为13,一个为4,默认为4字节对齐;
     union占对齐后数据的最大字节大小,默认为13+3=4*4=16;
     但是,该处强制为2字节对齐,实际为13+1=2*7=14字节
color   枚举类型的实例  4字节

4+14+4=22字节
发表于 2015-07-31 19:02:54 回复(10)
union和struct是不一样的,如果对齐为2而且最大的弄成2的倍数就行,也就是union大小就是14,无论下边添加多少int 元素
发表于 2015-08-17 18:43:35 回复(3)
xxj头像 xxj
22
发表于 2014-11-24 11:09:18 回复(0)
关于那个函数指针的问题,如果不加typedef,就是说这是类本身的函数指针,需要计算指针占用空间;如果加上typedef,说明这只是该函数指针的别名,不是类自己的指针
发表于 2016-09-06 09:12:41 回复(2)
请看一下union与struct内存占用的区别,struct定义的才会考虑所有数据类型占用内存,而union,顾名思义,就是共用体嘛,用最长的一个类型的占据空间供一个union类所有变量使用。
发表于 2016-08-25 15:28:20 回复(0)
代码开头的 #pragma pack(2) 意味着强制2字节对齐
int i 占4个字节
union是共享内存空间的,并且union所占的字节数由里面最大元素决定!因此char buff[13]和int i共享内存空间,由于2字节对齐,因此13+1,共占14个字节
成员函数不占内存空间
typedef是类型别名也不占内存空间,如果typedef去掉 就是一个指针 这个时候就要占内存空间 32位机器是4字节,64位机器是8字节
对于enum,规定其占一个int的大小,4个字节
总共就是:4+14+4=22字节
发表于 2021-03-17 10:46:13 回复(0)
这题答案就是22,用VS2010测试也是22,很多人说亲测24,那是因为你没有加#pragam pack(2)
发表于 2015-07-29 15:23:26 回复(2)
求解那个函数和函数指针怎么不算在内存占用里面
发表于 2016-03-08 09:49:14 回复(2)
看了很多解析,都没有提到typedef char* (*f)(void*);这只是一个类型定义,定义了一个函数指针类型,所以不计入大小;若是去掉typedef则是定义了一个函数指针,则需要计入大小
发表于 2018-05-28 08:33:56 回复(1)
对于第一条原则,每个变量相对于结构体的首地址的偏移量必须是对齐参数的整数倍,这句话中的对齐参数是取每个变量自身对齐参数和系统默认对齐参数#pragma pack(n)中较小的一个;
对于第二条原则,结构体变量所占空间的大小是对齐参数的整数倍。这句话中的对齐参数有点复杂,它是取结构体中所有变量的对齐参数的最大值和系统默认对齐参数#pragma pack(n)比较,较小者作为对齐参数。
发表于 2015-08-18 17:49:50 回复(0)
int i:  4字节
union:13字节(共用内存),2字节对齐,13 +  1  = 14字节。
enum枚举类型实例,4字节。
注意:
如果只是枚举声明,没有后面的color实例。即只有enum{red, green, blue};好像是不占空间的,待我去确认下。

编辑于 2017-05-19 15:15:52 回复(5)
1. int i,得到4个字节。

union对齐方法:
char buff[13]与int i,char类型1个字节,int4个字节,取较大的4个字节;然后与系统默认对比,由于设置了pack(2),系统默认为2。取较小的,即2个字节对齐。union就是2字节对齐。

但是union本身占用13个字节,以2对齐,所以最终为14个字节。

最后那个4字节,不用说了。

需要注意,不论char buff[]有都大,对齐是根据数据类型对齐。

还有有点,由于各个数据成员都可以乘除2,所以数据成员之间不需要padding,并且结构体中最长为4,系统默认为2,所以最终结构体也不需要padding。
发表于 2015-09-05 02:05:01 回复(3)
#pragma pack(x) 表示其下面书写的结构体中对齐单位为2
int 整数类型 4个字节  对齐为4
union 联合体 取其中最大的元素 13字节  对齐为14
void foo() {} 声明的函数没有形参和内容 就算调用也不会占用内存 只会作为标识符
typedef 函数名 自定义函数 但没有函数体 不占用内存空间
enum 枚举类  4个字节 对齐为4个字节
14+4+4=22



发表于 2021-05-13 21:12:47 回复(0)
一个char占一个字节,一个int占4个字节,共用体的大小取决于最大的那个类型,即字符数组的13个字节,
但是原本应该要为最大字节(4字节)的整数倍,即16个字节,但是这里有个pack(2),所以为2整数倍
即14个字节。
发表于 2020-03-28 16:27:28 回复(0)
i   4字节
u  一个为13,一个为4,默认为4字节对齐;
     union占对齐后数据的最大字节大小,默认为13+3=4*4=16;
     但是,该处强制为2字节对齐,实际为13+1=2*7=14字节(#pragma pack(2)   强制设定为2字节对齐)
     局部变量i没有分配内存的啊。
color   枚举类型的实例  4字节
4+14+4=22字节
发表于 2015-09-05 10:26:50 回复(4)
枚举类型所占四个字节!!
发表于 2017-09-20 21:33:37 回复(0)
typedef类型定义、函数定义都是不占空间的
发表于 2017-09-03 10:17:42 回复(2)
发表于 2015-07-14 16:45:44 回复(2)
#progma pack(2)说明是按照2个字节来对齐的。

一个int i 占4个字节;

union是联合体,联合体的大小由最大的数据类型来决定,
所以是按照char buff[13]的字节数来算,也就是13个字节,
由于要按照2个字节的大小进行对齐,所以是13+1=14个字节

关于枚举:
1)枚举的大小是按照enum中元素最大值所占的内存大小来决定的,不像结构体那样有多少个元素就按各个元素所占字节叠加。
2)当枚举成员的值小于4个字节时,占4个字节。
3)当枚举成员的值大于4个字节时,最大只能是longlong类型,占8个字节。

可见枚举类型的大小会随着其中的元素的大小而发生变化,虽然几乎没有人会用这么大的数来作为枚举,但起码我们得知道枚举类型字节数的大小是有可能发生改变的,所以到程序中有数据需要和别的程序进行交流,譬如上位机和下位机的通信数据,就尽量不要在数据包中包含有枚举类型,以免发生歧义。

所以最终的字节数就是:4+14+4=22个字节!!!
发表于 2022-07-02 20:16:38 回复(1)
注意顶部的2字节对齐。
编辑于 2018-11-27 21:21:02 回复(0)