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