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為最短,兩者之間取最短的為最寬基本成員。
}
