zoukankan      html  css  js  c++  java
  • 结构体的优化声明

    声明一个结构体的时候,因为考虑到内存的对齐。例如,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
    ",sizeof(char));
        printf("%d
    ",sizeof(int));
        node1 n1;
        node2 n2;
        printf("%d %d
    ",sizeof(n1),sizeof(n2));
        getchar();
        return 0;
    }

    最后输出:

    1

    4

    8 12

  • 相关阅读:
    技术人生:码农必读
    DDD:子龙关于聚合的总结
    DDD:DomainEvent、ApplicationEvent、Command
    VisualStudio:【外部工具】之代码生成器
    技术人生:为你的决定负责
    DDD:通过四色原型来理解聚合
    DDD:贫血模型和领域模型的一些思考
    TDD:第一次真正使用TDD的感受
    DDD:领域层服务的设计原则
    技术人生:大出着眼 小处着手
  • 原文地址:https://www.cnblogs.com/xing901022/p/3424366.html
Copyright © 2011-2022 走看看