zoukankan      html  css  js  c++  java
  • 怎样推断一个结构体的大小

    对于嵌入式系统来说,内存非常宝贵,那么在编程的时候就要尽量使自己用的数据结构所用的内存少,而结构体是C编程中经经常使用到的结构,保证结构体大小尽量的合理是非常重要的。

    以下说一下怎样推断一个结构体的大小。

    首先须要了解总线宽度和自然边界这俩个概念,编译器在分配结构体时依据这俩个因素来计算偏移量和空间占用。

    总线宽度:

    总线宽度就是一个处理器訪问周期最多能够訪问多少位的数据。总线宽度分为BUS16。BUS32,BUS64。

    自然边界:

    每个C的类型都有自然边界。假设某种类型数据所处地址是N的整数倍时訪问效率最高,那么这样的类型的自然边界就是数字N。

    以下是C语言数据类型的大小和自然边界值:

    C数据类型

    大小

    BUS16

    BUS32/64

    Char

    1

    1

    short

    2

    2

    Int

    4

    2

    4

    指针

    4

    2

    4

    long

    4

    2

    4

    bit

    ---

    非常整形一样

    float

    4

    2

    4

    double

    8

    2

    4/8

    struct

    --

    和具有最大须要的数据成员一致

    union

    --

    和具有组大的数据成员一致

    对结构体而言,结构体的自然边界与最大的数据成员一致,也就是说结构体的大小就是元素的个数乘以最大成员的自然边界。

    其他元素中间须要填充字节。

    以下是几个样例。都是对于BUS32说的,BUS16和64都对比表即可了:

    struct simple
    {
    	char a;`//它的自然边界就是int的自然边界,所以它的大小为12.
    	int b;  //它的结构是这种:{a000bbbbc000},每个字母代表一个字节,0代表填充字节
    	char c;
    };
    
    struct outer
    {
    	char x;<span style="white-space:pre">		</span><span style="font-family: Arial, Helvetica, sans-serif;">//simple的自然边界是4。所以char也要填充数据,大小为16</span>
    	struct simple y;   //{x000{a000bbbbc000}}
    };
    struct point<span style="white-space:pre">	</span>//自然边界是double,4,大小为20,{c000xxxxxxxxyyyyyyyy}
    {
    	char c;
    	double x,y;
    };
    注意自然边界不都是等于该数据类型的大小。
    #include <stdio.h>
    
    struct simple
    {
    	char a;
    	int b;
    	char c;
    };
    
    struct outer
    {
    	char x;
    	struct simple y;
    };
    struct point
    {
    	char c;
    	double x,y;
    };
    
    int main()
    {
    	struct simple vect[2];
    	//printf("%d
    ",sizeof(struct simple));
    	//printf("%d
    ",sizeof(vect));
    	//printf("%d
    ",sizeof(struct outer));
    	printf("%d
    ",sizeof(struct point));
    	return 0;
    }
    写个小程序測试一下对不正确。




  • 相关阅读:
    css样式初始化代码总结
    linux LVM逻辑卷的创建,扩容,缩减和删除
    MAC Jenkins安装 + Xcode + 蒲公英 + Testflight
    Linux rsyslog工具
    linux 中 Vi 和 Vim 的使用
    Zabbix实战--监控Nginx、MySQL与VM esxi主机、vSphere Client、JAVA应用
    Linux下netstat命令详解
    Debian 10上使用UFW设置防火墙
    开源网络安全检测工具——伏羲 Fuxi-Scanner
    CentOS8的web终端-cockpit,通过Cockpit管理KVM虚拟机
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/8433231.html
Copyright © 2011-2022 走看看