编程小技巧

    返回首页    发表留言
本文作者:李德强
          技巧二十二:变量内存占用
 
 

        今天跟大家分享的小技巧是关于变量内存占用的。我们通常在书本上会看到变量的占用内存字节数,有说int型变量占用2个字节,有的说int型变量占用4个字节,有的说long型变量占用4个字节,有的说long型变量占用8个字节……那么,哪一种说法是正确的呢?我们在实际使用变量的过程中应该如何判断变量占用的字节数呢?我们分别来看一下在32位程序和64位程序中各类型的变量占用的字节数:

32位系统程序
sizeof(char) = 1
sizeof(short = 2
sizeof(int) = 4
sizeof(long) = 4
sizeof(long long) = 8
sizeof(float) = 4
sizeof(double) = 8
sizeof(long double) = 12
64位系统程序
sizeof(char) = 1
sizeof(short = 2
sizeof(int) = 4
sizeof(long) = 8
sizeof(long long) = 8
sizeof(float) = 4
sizeof(double) = 8
sizeof(long double) = 16

        可见在32位和64位系统下不同的只有long、long long和long double,当然int类型变量在16位系统里占用2个字节,由于16位系统已经不多见了,我们只在32位系统和64位系统下比较变量占用内存情况。知道了基本类型占用内存情况之后,我们再来看看结构体当中的变量占用内存情况。我们看这样一个结构体:

typedef struct s_mem1
{
    char a;
    int b;
} s_mem1;
printf("%d\n", sizeof(s_mem1));

        程序运行的结果为:

8

        我们知道char类型变量占用1个字节,int类型变量占用4个字节,但是同时具有char类型和int类型的结构体一共占用字节数不是5而是8。编译器为了使CPU运算速度更快,需要对占用内存字节数不对齐的变量做处理,使所有的变量内存对齐,通常是4的整数倍。所以说:char a;这个变量本身占用一个字节,但为了与int b;变量对齐,只要为其分配4个字节的内存空间,所以这个结构体整体所占用的内存字节数为8。我们接着来看这样的结构体:

typedef struct s_mem1
{
    char a;
    int b;
    long c;
} s_mem1;
printf("%d\n", sizeof(s_mem1));

        程序运行的结果为:

16

        由于long类型变量占用8个字节的内存空间,所以char a;和int b;都需要与long c;对齐但char类型的变量可以与其它类型变量一同与long类型变量对齐,也就是说:为了与long c;对齐char a;和int b;分别都占用4个字节,所以这个结构体整体所占用的字节数为16。

typedef struct s_mem1
{
	char a;
	int b;
	long c;
} s_mem1;
typedef struct s_mem2
{
	char d;
	s_mem1 e;
	long f;
} s_mem2;
printf("%d\n", sizeof(s_mem2));

        程序运行的结果为:

32

       首先为了与long f;变量对齐char d;所以char d;也占用8字节,而s_mem1 e;占用16字节,long f;占用8字节,所以整个结构体占用32个字节。注意,我们如果直接将s_mem1结构体中的变量定义在s_mem2中:

 

typedef struct s_mem2
{
    char d;
    char a;
    int b;
    long c;
    long f;
} s_mem2;
printf("%d\n", sizeof(s_mem2));

        程序运行的结果为:

24

        也就是说char d; char a; 两个变量一共占用4个字节,int b;占用4个字节,long c;占用8字节,long d;占用8字节,一共占用24个字节。

 

        今天的小技巧你学会了吗?

 

    返回首页    返回顶部
  看不清?点击刷新

 

  Copyright © 2015-2023 问渠网 辽ICP备15013245号