看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《EdisonX (閉上眼的魚)》之銘言: : 這陣子接了小家教,講義從頭到尾自己編,編的過程有些概念其實不是很確定, : 依慣性作法,家教結束後把問題擠在一起一次提出, : 請各位版友不吝指教。 : ------ : 1. 列舉(enum)之變數能否以常數設初始值? : enum E1{x, y, z}; : enum E1 var = 0; : 我翻以前的書是寫不行,但手邊 compiler 是都可以過。 不合法,不能將int轉換為E1 : 另外想請教 C++ 下面這兩個 enum 是不是合法的 (它在 C 是不合法的) : enum E1{x,y,z}; : enum E2{a,b,x}; : 關鍵在於 x 被兩個 enum 當作列舉元,C 沒有 :: 概念,但 C++ 有, : 不知上面這段是否合法? emumerator的scope和整個enum一樣,所以如果E1和E2在同個scope裡面,那就不合法, 但是這樣是ok的: enum e1 { x = 1 }; namespace foo { enum e2 { x = 2 }; } x; // 1 foo::x; // 2 : 2. 針對 C string library 而言,諸如 strchr, strstr, strtok... etc, : 標準裡是否已有明確規定,函式必須對輸入引數為 NULL 時做處理避免發生錯誤? C標準沒寫,更正:
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
EdisonX:http://codepad.org/tVtuKnuZ 09/17 02:27
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