[問題] 寫template,能否判斷是基本type?

看板C_and_CPP作者 (stu)時間14年前 (2011/09/24 04:36), 編輯推噓6(6023)
留言29則, 6人參與, 最新討論串1/1
如果是基本型別 那麼我在搬資料的時候就可以用memcpy 但是若是自訂類別 那麼就只能用loop和operator 我知道可以特化某些型別 但是這樣就要手動寫出很多額外的template出來 所以想請教板上先進 有沒有可以在template判斷是否能用memcpy的方法 或者在compile time就已知loop次數的情況下 compiler會幫我最佳化 所以其實我不需要去管這個? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.251.45 ※ 編輯: iamstudent 來自: 140.113.251.45 (09/24 12:37)

09/24 13:13, , 1F
單純要判斷 POD: http://codepad.org/lLUia8Wy
09/24 13:13, 1F

09/24 13:15, , 2F
可再優化,可能會有更好作法,但compile opt.不會把 loop
09/24 13:15, 2F

09/24 13:15, , 3F
assign 換成 memcpy.
09/24 13:15, 3F

09/24 13:24, , 4F
對了,incldue algorithm 裡的 copy/fill 應都有優化過.
09/24 13:24, 4F

09/24 13:24, , 5F
感謝回覆,typeid的作法似乎會多出run time比較
09/24 13:24, 5F

09/24 13:24, , 6F
我想知道的是能不能compile time就決定
09/24 13:24, 6F

09/24 13:25, , 7F
另外,最佳化會把短loop展開嗎?
09/24 13:25, 7F

09/24 13:30, , 8F
不會展開,這也是數值分析src求速度要把loop全都roll開
09/24 13:30, 8F

09/24 13:35, , 9F
std::copy 對內建型別通常會採較低階/快速的複製動作
09/24 13:35, 9F

09/24 13:36, , 10F
@loveme00835:所以copy對POD「有可能」偷做 memcpy 嗎?
09/24 13:36, 10F

09/24 13:36, , 11F
但不是必然
09/24 13:36, 11F

09/24 13:40, , 12F
@tropical72: yes
09/24 13:40, 12F

09/24 13:42, , 13F
STL algorithms不只是一些C語言函式的替代方案,我覺
09/24 13:42, 13F

09/24 13:44, , 14F
得他也讓讀者用更高階方式思考,及提供正交性可讀性,
09/24 13:44, 14F

09/24 13:45, , 15F
同樣一個for, tells nothing
09/24 13:45, 15F

09/24 13:45, , 16F
謝謝lovme00835不吝指導 *^_^*
09/24 13:45, 16F

09/24 14:31, , 17F
我自己找到答案了,c++ templates The Complete Guide
09/24 14:31, 17F

09/24 14:32, , 18F
19.1有可以確定是否為基本type的辦法
09/24 14:32, 18F

09/24 14:33, , 19F
還是會增加額外的run time比較,但是比起t大的typeid
09/24 14:33, 19F

09/24 14:34, , 20F
可以只比較一次
09/24 14:34, 20F

09/24 16:19, , 21F
樓上那本書裡面就有解答了!
09/24 16:19, 21F

09/24 16:20, , 22F
C++ algorithm真的蠻建議讀侯捷的STL源碼剖析
09/24 16:20, 22F

09/24 16:20, , 23F
std::copy幫你處理了很多事,看完你會發現C++很威
09/24 16:20, 23F

09/24 16:23, , 24F
哪要那麼麻煩,早就有現成工具了
09/24 16:23, 24F

09/24 16:23, , 25F
09/24 16:23, 25F

09/24 16:24, , 26F
現代的compiler很猛,迴圈如果只操作POD會展開很正常
09/24 16:24, 26F

09/24 16:24, , 27F
不過如果中間通過一些比較複雜的運算就不一定了
09/24 16:24, 27F

09/24 16:46, , 28F
The Complete Guide這本書真的很棒
09/24 16:46, 28F

09/24 16:48, , 29F
metaprogramming展開迴圈、ifelse都可以辦到
09/24 16:48, 29F
文章代碼(AID): #1EVLu_Jc (C_and_CPP)