结构体内存对齐

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为最短,两者之间取最短的为最宽基本成员。
}
 
原文地址:https://www.cnblogs.com/sjxbg/p/5691231.html