声明一个结构体的时候,由于考虑到内存的对齐。例如,int型的变量,须要4个字节,那么它在存储的时候就须要在地址可以被4个字节整除的地方开始申请。node
例如咱们申请下面这样的一个结构体:优化
struct{ char a; int b; char c; } node1;
在内存分配的时候,char占一个字节,int 占四个字节。spa
c语言在进行内存分配的时候,须要根据最大的宽度来进行分配。如咱们例子中,int须要4个字节,在分配char型的时候,虽然char只占用一个字节,可是也须要从4个字节的位置开始分配。code
分配的内存以下:blog
a | - | - | - | b | c | - | - | - |
a分配结束后,要自动填充3个字节,再分配b,而后是c,再自动填充3个字节。内存
因此node1这个结构体的宽度是12get
咱们尽可能把对边界要求严格的字段放在前面,要求弱的放在后面(强弱就是相对于宽度对齐来讲):string
struct{ int b; char a; char c; } node1;
b | a | c | - | - |
这样,先分配int,再分配char,虽然每次申请4个字节,可是最后的长度倒是8,所以节省了33%的地址空间。io
// test1107.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "stdio.h" #include "string.h" typedef struct{ int b; char a; char c; } node1; typedef struct{ char a; int b; char c; } node2; int main(){ printf("%d\n",sizeof(char)); printf("%d\n",sizeof(int)); node1 n1; node2 n2; printf("%d %d\n",sizeof(n1),sizeof(n2)); getchar(); return 0; }
最后输出:table
1
4
8 12