TC和VC环境下,内存分配的差异

论坛 期权论坛 脚本     
匿名技术用户   2021-1-12 11:20   52   0

今天,看了一道腾讯的笔试题 ,大意如下:

struct MyStruct
{
 
int abc;
 
short xyz;
 
char cdf;
};
char * p1;
void * p2;
int p3;
char p4[ 10 ];
// 问:
sizeof ( struct MyStruct) = ?
sizeof (p1...p4) = ?

注意这道题的回答,必须指出一个前提:在什么环境下。刚才测试了一下,在TC环境下:

sizeof(struct MyStruct) : 5 //int为2,short为2,char 为1

任何类型的指针都为2,sizeof(数组名称) == 数组元数的总字节数。

在VC环境下:

sizeof(struct MyStruct) : 8 //int为4,short为2,char 为1,为什么不是7?

因为,VC为结构体struct、类class分配内存时,如果元素所占的总内存大于4,则以4的倍数来分配。这好像叫做边界问题。在大于4的前提下,分配的时候,按顺序,检测每个元素的大小,如果小于4,则测试它的下一个元素,如果两个元素的总大小超过了4,就给前面那个元素单独分配4,如果两个元素都小于4,而加上下一个元素又大于4,则为前面两个元素分配4。。。,这就是说,一个结构的大小,还可能跟结构体内的元素的定义顺序有关。例如:

struct MyStruct
{
 
int abc; // int大小为4,分配4
 
short xyz; // short大小为2,下一个元素char的大小为1,加起来小于4
 
char cdf; // 所以,为xyz 、cdf 分配4 。所以MyStruct大小为8
};

但注意,这一个结构体,只是顺序变了一下,大小就变成12了:

struct MyStruct
{
short xyz; // short大小为2,下一个元素int的大小为4,加起来大于4,所以单独为xyz分配4
  int abc; // int大小为4,分配4  
  char cdf; // 单独为cdf 分配4 。所以MyStruct大小为12
};

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP