结构体的优化声明

声明一个结构体的时候,因为考虑到内存的对齐。例如,int型的变量,需要4个字节,那么它在存储的时候就需要在地址能够被4个字节整除的地方开始申请。

例如我们申请下面这样的一个结构体:

struct{
char a;
int b;
char c;
} node1;

在内存分配的时候,char占一个字节,int 占四个字节。

c语言在进行内存分配的时候,需要根据最大的宽度来进行分配。如我们例子中,int需要4个字节,在分配char型的时候,虽然char只占用一个字节,但是也需要从4个字节的位置开始分配。

分配的内存如下:

a

-

-

-

b

c

-

-

-

a分配结束后,要自动填充3个字节,再分配b,然后是c,再自动填充3个字节。

所以node1这个结构体的宽度是12

优化声明

我们尽量把对边界要求严格的字段放在前面,要求弱的放在后面(强弱就是相对于宽度对齐来说):

struct{
int b;
char a;
char c;
} node1;

b

a

c

-

-

这样,先分配int,再分配char,虽然每次申请4个字节,但是最后的长度却是8,因此节省了33%的地址空间。

代码验证

// 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;
}

最后输出:

1

4

8 12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python小屋

几行代码理解Python变量访问的LEGB顺序

Python变量访问时有个LEGB原则,也就是说,变量访问时搜索顺序为Local ==> Enclosing ==> Global ==> Builtin,听起...

30340
来自专栏mySoul

TypeScript入坑

安装插件 https://github.com/Microsoft/TypeScript-Sublime-Plugin

17310
来自专栏程序员的SOD蜜

C#中?与??的区别

起初我也不知道C#中有??操作符,今天张鹏在查看我的MVC示例程序的时候问了这个问题,检查代码后发现,下面的代码是VS2010在生成MVC应用程序自己添加的: ...

24670
来自专栏java一日一条

教你在Java接口中定义方法

接下来,SimpleTimeClient类实现了TimeClient接口,具体代码如下:

18920
来自专栏抠抠空间

Django 2.0 新款URL配置详解

Django2.0发布后,很多人都拥抱变化,加入了2的行列。 但是和1.11相比,2.0在url的使用方面发生了很大的变化,下面介绍一下:

31650
来自专栏xiaoxi666的专栏

c++ 继承类强制转换时的虚函数表工作原理

本文通过简单例子说明子类之间发生强制转换时虚函数如何调用,旨在对c++继承中的虚函数表的作用机制有更深入的理解。

22830
来自专栏从零开始学自动化测试

python笔记14-读取yaml配置文件

yaml简介 1.yaml [ˈjæməl]: Yet Another Markup Language :另一种标记语言。yaml 是专门用来写配置文件的语言,...

65780
来自专栏友弟技术工作室

Go 程序的基本结构和要素

示例 package main import "fmt" func main() { fmt.Println("hello, world") } 包...

339110
来自专栏mathor

线程同步

13530
来自专栏逍遥剑客的游戏开发

PL/0语言编译程序分析

34150

扫码关注云+社区

领取腾讯云代金券