zoukankan      html  css  js  c++  java
  • 结构体内存对齐

    1.c++性能大概比c慢30%,但是开发效率要比c快很多。
    2.匿名结构体 : 锁定变量的个数
    #include <stdio.h>
    #include <stdlib.h>
        struct //匿名结构体
    {
        int num;
        double db;
    }*p, x[10], z;

    3.一个结构体或联合至少要存在一个成员。

    4.数组名与指针的区别是一个是变量一个是常量。
    5.任何指针在win32情况下都只占4个字节。
    6.通过地址访问元素
    (&csdndata[i])->email不加括号会 有优先级的问题。 和 csdndata[i].email 是一样的。
    7.alloca分配的内存在栈上,malloc在堆上。
    struct csdn *p1 = alloc(sizeof(struct csdn)*num);
    memset(void *s, char ch, size_t n)将s所指向的某一块内存中的每一个字节的内容全部设置成ch指定的ASCII值,块的大小是该指针指向的地址后面的n个字节。注意0代表的就是NULL。

    存储在堆上是需要free去释放内存的,而存储在栈上是不需要去free的。


    8.结构体大小内存对齐:

    结构体中成员按照定义时的顺序依次存储在连续的内存空间。但并不是像数组那样的连续。
    内存对齐计算内存地址比较方便,内存地址会非常有规律,减小了内存寻址时间。若不对齐,内存地址的变化非常没有规律,
    内存地址往往是在寄存器里计算出来的
    基本类型指的是像char、int、float、double这样的内置数据类型

    • 结构体总大小大于等于所有成员的大小之和。
    • 结构体的总大小必须可以整除最宽基本成员。
    • 结构体成员的地址-结构体的首地址 = 偏移量,必须是当前成员整数倍
    • 结构体尾部不足的部分,就会被填充。 整数包括正整数、0、负整数, 吧
    • 当只用一个成员时不存在对齐。
    • 两者取最短原则。(详情请看下面的补充)
    struct my
    {    
         int num1;
         char num2;          //偏移量是4,可以整除1,  
         double num3;       // 偏移量是13,要想整除8,需要在char后边填充三个字节
         char num4;         //加上这个就是17个字节了,要想让它能够整除最宽的基本成员,需要在char后边填充7个字节
    };
    总字节是24字节。
    我是这么理解的,就是偏移量不知道理解的对不对

    2016.7.25补充:
    数组和字符串都不属于最宽基本成员。要不然你弄个数组里边包含几十个元素,那么拿他对齐那得有多大的内存呀。
    struct Mystruct
    {
          char str[13];
          double a;  
    };    //该结构体占用24个字节毋庸置疑
    
    struct Mystructx
    {
           struct Mystrct test;
           char b;  //结构体嵌套的情况下,最宽基本成员不局限于当前的结构体,会把被嵌套的结构体成员也算上。。
    };  //这个结构体占用32个字节
    • 关于两者取最短:(这个主要说的是你编译器的设置)
    struct Mystruct
    {
      char str[23];
      short db;  //若是你用编译器设置的结构体对齐宽度是4字节,在结构体中如果没有比4短的就取4,如果有short就取2为最短,两者之间取最短的为最宽基本成员。
    }
     
  • 相关阅读:
    使用.Net Core RT 标准动态库
    X509 颁发者和使用者 详解
    .Net Core 中X509Certificate2 私钥保存为 pem 的方法
    dpkg:处理软件包 mysql-server-5.5 (--configure)时出错
    sql server time(7) 默认值
    如何 打包整合linux系统文件夹 用于刷机包等等, 其中包括打包 句号开头 . 开头的文件, 排除系统文件 等
    Visual Studio 2015中 安卓环境 cannot find adb.exe in specified sdk path
    PuTTY 命令行改进 有效解决 中文乱码
    System.Windows.Forms.WebBrowser中 处理 js 脚本 window.Open 禁止新建窗口 的方法
    rest_framework之认证与权限 token不存数据库认证
  • 原文地址:https://www.cnblogs.com/sjxbg/p/5691231.html
Copyright © 2011-2022 走看看