首页 > 试题广场 >

设 struct{ short a; ch

[单选题]
struct {
    short a;
    char b; 
    float c; 
}cs; 
sizeof(cs)的值是
  • 4
  • 5
  • 7
  • 8
结果为8。该题考察的是结构体成员变量的占据空间CPU对变量读取的优化
  • 结构体中成员变量分配的空间是按照成员变量中占用空间最大的来作为分配单位,同样成员变量的存储空间也是不能跨分配单位的,如果当前的空间不足,则会存储到下一个分配单位中。
  • 为提高cpu读取的性能,采用补齐的方法提高cpu的效率。即内存为8字节的数据,一定会被一次读取,这当然需要调整变量在内存中的起始地址,使其从0开始。若一个变量不满足8字节,则进行补齐,保证其后一个变量的地址满足cpu读取的初始地址。
  • 内存的分配,不仅数据类型相关,还和变量声明的顺序相关,根据题意如下图所示:第一个变量是short占2个字节,第二个为char占1个字节,要对char进行补齐补齐为2个字节(按照结构体中内存最大的类型为单位进行补齐),第三个为float,占4个字节,按4个字节进行补齐操作.。
根据题目给定:short a(2byte)+char b(1byte)+float c(4byte)=8



发表于 2019-04-29 18:48:18 回复(0)
更多回答
推荐
应该是8。
首先看各类型元素占的字节数:
short是2字节
char是1字节
float是4字节
过程:
首先short占了2字节,然后轮到char,他只占1但是由于已经有了short的2字节所以整个结构体需要是2字节的倍数,因此char占了1字节之后对齐补上1字节。最后轮到float,4字节,是2的倍数所以不用补。
现在整个结构体就是2+(1+1)+4=8,结构体的大小需要是最长元素的倍数,也就是4的倍数,很显然满足,所以最终答案就是8。
编辑于 2019-04-30 14:15:55 回复(0)
答案为8 结构体需要考虑结构体对齐的情况,而且还要看你所用的编译器平台,在vs平台下,默认对齐数为8, 首先一个第一个变量在0偏移处。短整型占两个字节,现在就到了2偏移处,一个char占一个字节,2是1的倍数,直接加在后面,现在是3偏移处,而float是4个字节,4不是3的倍数,需要再开辟一个字节,到4偏移处,然后加上4,所以结构体大小为8个字节,最后还要考虑,结构体总大小是不是所有变量的中最大对齐数的倍数,这个就是,就不用加了。如果不是的话,需要加到它的倍数
编辑于 2017-03-09 10:51:29 回复(0)

答案:D
要回答问题:先要了解一下struct大小的计算

就是每个成员的占用字节数相加。
32位操作系统:

char : 1 int :4 short : 2 unsigned int : 4 long : 4 unsigned long : 4 long long : 8 float : 4 double : 8 指针 : 4

64位操作系统

char : 1 int :4 short : 2 unsigned int : 4 long : 8 unsigned long : 8 long long : 8 float : 4 double : 8 指针 : 8

size(short)+size(char)+size(float)=2+1+4=7

欧也,答案是D,是D,是D啊。

但是作为一个稳重的人工智能,我得验算一下:

#include <iostream>
using namespace std;
struct { 
    short a;
    char b; 
    float c; 
}cs; 
int main()
{
   cout << sizeof(cs);
   return 0;
}

输出是8啊,是8,是...

点解?

内存对齐

成员对齐有一个重要的条件,即每个成员按自己的方式对齐。
其对齐的规则是:每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里默认是8字节)中较小的一个对齐。并且结构的长度必须为所用过的所有对齐参数的整数倍。不够就补空字节。

分析

short = 2 ,char = 1 , float=4

step1: 分配两个字节给short

step2:分配1个字节给char
验算:当前3是不是用过的所有对齐参数的整数倍了?不是啊,那最近的是多少?
4啊,所以这个时候,struct的长度就是4了啊。

step3:再分配4个字节给float
验算:总长度是8,是所有成员大小的倍数吗?是啊。

所以就是8.

考试的时候,如果面对题目错误,那只有可能是揣测出题人的意图,那出题人的意图就是出题的时候没有考虑对齐嘛。
所以,把举起的小手手放下,这题咱选D。
(面试的时候跟面试官刚题目有问题是不成熟的表现,咱只勾选项里面最符合出题意图的选项)

发表于 2019-04-29 17:14:50 回复(0)
为了存取效率,内存需要进行对齐,用空间换时间,最终结构体的大小与结构体中成员类型和定义的顺序有关系,最小的分配单位是占空间最大的类型的大小。
编辑于 2021-12-03 09:17:21 回复(0)
sizeof(cs) = 8  吧
上代码:


发表于 2019-04-29 16:31:28 回复(0)
D
解题思路:sizeof的功能计算类型长度,short占2个字节,char占1个字节,float占4个字节,所以cs占7个字节,结果为7。
发表于 2017-01-23 14:25:14 回复(2)
字节对齐4个字节,char一个字节,short两个字节。int四个字节。
发表于 2022-01-15 00:25:55 回复(1)
a a b
c c c c
根据结构体的对齐原则,可得上图,故结果为8。
发表于 2020-06-10 21:18:45 回复(0)
注意内存对齐原则就可以自己算了


发表于 2019-04-29 22:52:17 回复(0)
没正确答案,选择E 8
发表于 2019-04-29 14:42:29 回复(0)
字节对齐4个字节,char一个字节,short两个字节,合起来没超过四个字节,所以存在一起,算四个字节,加上int四个字节一共八个字节
发表于 2021-03-12 23:41:43 回复(0)
结构体数据要对齐,切记切记
发表于 2022-10-13 23:37:25 回复(0)
结构体对齐 在x86下占8位
发表于 2022-10-12 09:36:08 回复(0)
奇数字节需要字节对齐,加一变成偶数
发表于 2020-09-09 20:42:25 回复(0)
(1)结构体中成员变量分配内存空间是按照成员变量中类型占用空间最大的来作为分配单位的
(2)成员变量的存储空间不能跨单位分配。
发表于 2019-08-04 10:36:21 回复(0)
结果为8,需要考虑补齐。
发表于 2019-04-30 11:24:34 回复(0)
去学一下编译器字节对齐
发表于 2019-04-29 17:21:27 回复(0)