c语言中结构体占用内存分析
2016-09-17 15:27
211 查看
在说结构体之前有必要先说一下在不同编译器中各变量所占内存字节大小:
1、32位编译器下,即X86环境下
指针类型都是占用4个字节,如char* 、int*、double*
2、对于64位系统即X64环境,64位编译器下:
指针类型都是占用4个字节,如char* 、int*、double*
从而可以看出在32位和64位编译器中,除了指针变量的寻址范围从32位增加到了64位,其他变量占用字节数是一样的。但对于16位系统int变量只有两个字节,要单独来分析。
现在可以说一下结构体占用空间的问题了(32位编译器)。
怎么理解上段绕口的定义呢?可以有以下几个例子解释。
1、
那么问题来了,什么是默认对齐方式呢?
可以这样简单解释一下,
还有一种可能就是,
再来看下一个例子:
显然sizeof(t1)结果为16,空间分配如下图:
当然了,如果设置对齐方式为4字节对齐,结果又不一样了。
洋洋洒洒写了这么多,可能有点乱,最近很多校招,有时间再改。
1、32位编译器下,即X86环境下
指针类型都是占用4个字节,如char* 、int*、double*
2、对于64位系统即X64环境,64位编译器下:
指针类型都是占用4个字节,如char* 、int*、double*
从而可以看出在32位和64位编译器中,除了指针变量的寻址范围从32位增加到了64位,其他变量占用字节数是一样的。但对于16位系统int变量只有两个字节,要单独来分析。
现在可以说一下结构体占用空间的问题了(32位编译器)。
struct TEST1 { char a; short b; int c; }t1;这个结构体中,sizeof(t1)为8,因为最大字节数变量int是4字节,这里是默认4字节对齐的
怎么理解上段绕口的定义呢?可以有以下几个例子解释。
1、
#include<stdio.h> #pragma pack(push) //保存对齐状态 #pragma pack(4) struct TEST1 { int a; double b; short c; }t1; int main() { printf("%d",sizeof(t1)); return 0; }其中 int、double、short一共是4+8+2=14,大于定义的4字节数对齐方式,所以可以不用满足默认对齐方式,必须满足4字节数对齐,所以sizeof(t1)结果为16字节,
那么问题来了,什么是默认对齐方式呢?
可以这样简单解释一下,
#pragma pack(4) struct TEST1 { char a; }t1;这个结构体中char字节数为1小于设置的4字节数对齐,所以要满足默认字节数对齐,故sizeof(t1)结果是1,而不是4.
还有一种可能就是,
#include<stdio.h> //#pragma pack(push) //保存对齐状态 //#pragma pack(4) struct TEST1 { int a; double b; short c; }t1; int main() { printf("%d",sizeof(t1)); return 0; }这个程序的结果为24,因为没有指定字节数对齐方式,故采用默认的对齐方式8字节对齐(double类型字节数为8).
再来看下一个例子:
#include<stdio.h> //#pragma pack(push) //保存对齐状态 //#pragma pack(4) struct TEST1 { char a; short b; double c; }t1; int main() { printf("%d",sizeof(t1)); return 0; }发现这个程序和上个有什么区别没有?只是调换了一下double和short的顺序而已,那结果如何呢?
显然sizeof(t1)结果为16,空间分配如下图:
当然了,如果设置对齐方式为4字节对齐,结果又不一样了。
#include<stdio.h> #pragma pack(4) struct TEST1 { char a; short b; double c; }t1; int main() { printf("%d",sizeof(t1)); return 0; }这段程序的结果为12,空间分配如下图:
洋洋洒洒写了这么多,可能有点乱,最近很多校招,有时间再改。
相关文章推荐
- C语言中结构体和共同体在内存中占用字节数
- C语言结构体占用空间内存大小解析
- C语言内存中结构体对齐分析
- C语言结构体占用空间内存大小解析
- PHP数组实际占用内存大小的分析
- PHP数组实际占用内存大小的分析
- C语言 结构体的内存对齐问题与位域
- C语言——指针与结构体 内存的动态分配
- 结构体内嵌联合体的内存占用
- 本人认为最好的结构体占用内存讲解文章
- PHP查询MySQL大量数据的内存占用分析
- c语言中结构体的大小和内存对齐问题
- Linux内存占用分析 进程内存空间
- 程序占用的内存分析
- C语言——指针与结构体 内存的动态分配
- C语言struct内存占用问题
- PHP查询MySQL大量数据的时候内存占用分析
- gcc 中结构体(struct)内存对齐问题分析
- PHP查询MySQL大量数据的内存占用分析
- PHP数组实际占用内存大小的分析