2020.10.31 32位机和64位机数据类型、字节对齐问题

REAL TALK

你好!juice,通过几周的努力,也算是找到了自己很中意的工作,等到明年毕业的时候,也可以给自己的大学生涯画一个较圆的句号,功夫不负有心人嘛!还记得你那时候觉得很苦,熬过很多通宵,一次次折磨到心态爆炸的bug,多少个早上醒来眼睛肿得不像样,我觉得那时的你很酷,谢谢你撑下来了。

新的改变

好久没有写过日志了,markdown的语法都生疏了,哈哈哈哈,没事的,慢慢搞起来,将每天学到的知识记录下来,是要像markdown标题一样,新的改变,是要做出新的改变,之前做的东西太过于急于求成,有很多地方一带而过,没有好好的总结,距离实习还有一段时间,是要回过头好好把知识整理一下,有的问题要刨根问底,要揪其根源。

1、字节对齐

ubuntu20.04(64位机)下数据类型占用字节数

代码
#include <stdio.h>
int main(void)
{
	printf("char:%ld\n",sizeof(char));
    printf("short:%ld\n",sizeof(short));
    printf("int:%ld\n",sizeof(int));
    printf("float:%ld\n",sizeof(float));
    printf("long:%ld\n",sizeof(long));
    printf("double:%ld\n",sizeof(double));
    printf("long long:%ld\n",sizeof(long long));
}
运行结果:
		char:1
		short:2
		int:4
		float:4
		long:8
		double:8
		long long:8

Redhat 6.3(32位机)下数据类型占用字节数

代码
#include <stdio.h>
int main(void)
{
	printf("char:%ld\n",sizeof(char));
    printf("short:%ld\n",sizeof(short));
    printf("int:%ld\n",sizeof(int));
    printf("float:%ld\n",sizeof(float));
    printf("long:%ld\n",sizeof(long));
    printf("double:%ld\n",sizeof(double));
    printf("long long:%ld\n",sizeof(long long));
}
运行结果:
		char:1
		short:2
		int:4
		float:4
		long:4
		double:8
		long long:8

32位机和64位机字节对齐区别

在通过上面代码验证,可以看出来除了long类型不同,其他的都一模一样,下面来验证结构体字节对齐

32位机:
#include <stdio.h>
struct AA
{
    char q;
    int c;
    double p;
};
struct AAA
{
    char q;
    int c;
    double p;
    char i;
};
struct BB
{
    char w;
    short r;
};
struct CC
{
    char q;
    int e;
};
struct DD
{
    int c;
    char a;
    short y;
};
struct EE
{
    char c;
    int d;
    char f[];
};
struct FF
{
    char c;
    int d[0];
};
struct GG
{
    char c;
    int d[5];
};
int main(void)
{
	printf("%ld\n",sizeof(struct AA));
    printf("%ld\n",sizeof(struct AAA));
    printf("%ld\n",sizeof(struct BB));
    printf("%ld\n",sizeof(struct CC));
    printf("%ld\n",sizeof(struct DD));
    printf("%ld\n",sizeof(struct EE));
    printf("%ld\n",sizeof(struct FF));
    printf("%ld\n",sizeof(struct GG));
}
运行结果:
		16
		20
		4
		8
		8
		8
		4
		24

64位机:
#include <stdio.h>
struct AA
{
    char q;
    int c;
    double p;
};
struct AAA
{
    char q;
    int c;
    double p;
    char i;
};
struct BB
{
    char w;
    short r;
};
struct CC
{
    char q;
    int e;
};
struct DD
{
    int c;
    char a;
    short y;
};
struct EE
{
    char c;
    int d;
    char f[];
};
struct FF
{
    char c;
    int d[0];
};
struct GG
{
    char c;
    int d[5];
};
int main(void)
{
	printf("%ld\n",sizeof(struct AA));
    printf("%ld\n",sizeof(struct AAA));
    printf("%ld\n",sizeof(struct BB));
    printf("%ld\n",sizeof(struct CC));
    printf("%ld\n",sizeof(struct DD));
    printf("%ld\n",sizeof(struct EE));
    printf("%ld\n",sizeof(struct FF));
    printf("%ld\n",sizeof(struct GG));
}
运行结果:
16
24
4
8
8
8
4
24

分析

通过上面在俩种机上跑代码发现,结构体AAA在32位机是20,在64位机是24,原因是32位机只有4个字节,最长对齐模式只能按4个字节对齐,double和long long都是分为2个4字节存放的,同理,64位机是八个字节,会遵从内部最大成员的长度来对齐,不足的会自动补齐,在64位的结构体AA中double是最长的,所以一个字节的char会根据8字节对齐让总长成为24。

结束

在面试中面试官问在结构体字节对齐中,可变数组占多少位,这个其实在它未确定数组长度时,它的长度是零,并且想在结构体中申请的话要放在最后,如果不这样会影响结构体之前的对齐规则。
以下是个人感觉牛逼的blog
字节对齐1
字节对齐2
字节对齐3

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页