推 littleshan:Q2 是寫在 7.1.4,傳 null 時是 undefined behavior 09/17 10:35
: 3. bsearch 為 stdlib 之二分搜尋法,但二分搜尋法會隨著問題不同導致寫法不同,
: 請教若鍵值存在時,
: C Stdlib library 裡之 bsearch 是否有保證找到的會是第一個 key-value?
否,C標準如此說:
The bsearch function returns a pointer to a matching element of the array,
or a null pointer if no match is found. If two elements compare as equal,
which element is matched is unspecified.
你可以用std::equal_range(...).first
: 4. NULL 本身做「取址」會怎樣?
: 這是在寫指標範例時,為了清楚表達寫下的 code ,
: 但細思,若有一個步驟為對 NULL 做取址,是否合法?
: int *Ptr = NULL;
: printf(" Ptr = %08x\n", Ptr);
: printf("&Ptr = %08x\n", &Ptr);
: printf("*Ptr = %08x\n", *Ptr);
: 這點不知道在標準裡面有沒有明文規定?還是讓 compiler 自己搞?
第一個printf OK,印出null pointer真正的value
第二個也OK,印出Ptr這個lvalue的位置,
第三個是UB (dereference null pointer)
: 5. 有沒有 float32 / float64 之資料型態?
: C99 後多了 stdint.h ,裡面有 uint32_t 等資料型態,
: 針對浮點數,是否只能以 typedef 方式去做而已?
: typedef 的話我想不透有沒有辦法轉交由 macro 判定,
: 不知有沒有人有經驗?
據我所知是沒有...不過不太懂你想問什麼._.?
: 6. 一律以動態配置方式建立實體資料
: 這個有點像是資料結構的問題了。假定為 array。
: 若是有含「交換」動作的 sort algorithm ,
: 若資料內容是一份屬性不少的 struct ,
: 在做 swap 時會花不少時間。
: 假設欲建立起 struct Data array[N],
: 個人比較推用下面這種方式 < 只是示意而已,malloc 部份會做優化 >
: // 先建立 N 個指標
: struct Data** Array = \
: (struct Data**)malloc(sizeof(struct Data*) * N );
: // 每個指標再用 malloc 做實體配置
: for(i=0; i<N; ++i) {
: Arr[i] = (struct Data*)malloc(sizeof(struct Data));
: // Read Data
: }
: 好處是到時候要交換時只要對指標做交換,不用對整份 struct 做交換。
: 壞處當然也不少,像是會平白無故多了 pointer 佔空間、coding 複雜不易維護。
: 針對這種設計模式,我想問的是,在做「尋訪」時,會由於是 pointer to pointer
: 所以讀寫時間會比一般的直接寫入還慢嗎? 直覺是會,在此做確認。
: ( 我是覺得這種差異上的成本應該是比不上 swap 的成本來得高 )
要看你的memory access pattern,
因為Arr的每一個Data*指標所指到的空間可能不是連續的,讓prefetcher無法預測,
這樣cache miss造成的performance hit可能比你在連續空間內sort後循序讀取還要高,
尤其當你的資料量很大且讀的次數比sort的次數多很多的時候
: ------
: 問題有點多,煩請不吝賜教,小弟感激不盡 !!
個人淺見僅供參考,有錯歡迎指正
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.113.252.42
※ 編輯: PkmX 來自: 140.113.252.42 (09/17 00:34)
※ 編輯: PkmX 來自: 140.113.252.42 (09/17 00:49)
推 EdisonX:謝謝您的細心講解,收穫很多,關於 Q6 我要補充一下,實作時 09/17 01:24
→ EdisonX:我會把它們弄成一份連續的記憶體,也就是malloc一次而非 09/17 01:24
→ EdisonX:(N+1) 次, 在此情況下做循序讀取差別還會很大嗎? (只剩 09/17 01:26
→ EdisonX:pointer 多做一次索引動作) 09/17 01:26
推 EdisonX:補個醜醜的 code 當參考,這樣就沒不連續的問題了。 09/17 02:25
推 littleshan:Q2 是寫在 7.1.4,傳 null 時是 undefined behavior 09/17 10:35
※ 編輯: PkmX 來自: 140.113.252.42 (09/17 10:56)
→ Favonia:printf 是吃 void*... 10/05 06:56