作者查詢 / yvb
作者 yvb 在 PTT [ C_and_CPP ] 看板的留言(推文), 共847則
限定看板:C_and_CPP
看板排序:
21F推:基本上 Dev-C++ 用了 MinGW, 就是用 MS-Windows 的 C-Runtime04/25 00:22
22F→:DLLs,其中主要就是 MSVCRT.DLL (Microsoft C runtime library)04/25 00:24
23F→:而MSVC的 rand() 實作大概就是04/25 00:24
24F→: seed=seed*0x343fd+0x269EC3; return (seed>>0x10)&0x7FFF;04/25 00:25
25F→:因為 return 時做了 right-shift, 而 seed 的乘數不夠大,04/25 00:29
26F→:所以造成srand()用相近的seed,第一次rand()會得到相近的值.04/25 00:31
17F推:去編譯器選項, 開個最佳化, 再試試看執行結果吧...04/17 13:38
18F→:至少我用 gcc 測試, 最佳化用 -O1 和 -O2, 答案都不是 10 1004/17 13:44
6F推:有一些測試數據, 我放在在原原PO文章的推文中.04/11 01:42
16F推:以glibc-2.19為例,x86的memcpy實作有i586(以下)及i686(以上),04/11 01:33
17F→:i686下還做了multiarch,除了原來的i686,另增SSSE3及SSSE3+REP,04/11 01:33
18F→:當做成shared library時,可在runtime時,才判斷用i686的哪一種,04/11 01:33
19F→:但若是編譯時用 static link, 則固定使用原來的i686實作.04/11 01:34
20F→:我將上述i586,i686,sssse3,ssse3+rep幾種實作各別獨立出來,04/11 01:34
21F→:在幾款CPU上執行原PO程式搭配不同size,得到下列執行時間:04/11 01:34
22F→: (CPU:E5410) (size:65535) (size:65536) (size:65537)04/11 01:34
23F→: i586 0m5.183s 0m1.488s 0m1.951s04/11 01:34
24F→: i686 0m8.779s 0m0.873s 0m4.951s04/11 01:35
25F→: ssse3 0m0.697s 0m0.671s 0m0.696s04/11 01:35
26F→: ssse3+rep 0m0.645s 0m0.873s 0m0.648s04/11 01:35
27F→: (CPU:i3-2130) (size:65535) (size:65536) (size:65537)04/11 01:35
28F→: i586 0m0.542s 0m0.519s 0m1.262s04/11 01:35
29F→: i686 0m0.539s 0m0.244s 0m0.679s04/11 01:35
30F→: ssse3 0m0.191s 0m0.319s 0m0.190s04/11 01:36
31F→: ssse3+rep 0m0.218s 0m0.203s 0m0.218s04/11 01:36
32F→: (CPU:i5-650) (size:65535) (size:65536) (size:65537)04/11 01:36
33F→: i586 0m0.837s 0m0.608s 0m0.640s04/11 01:36
34F→: i686 0m0.954s 0m0.222s 0m0.547s04/11 01:36
35F→: ssse3 0m0.208s 0m0.322s 0m0.208s04/11 01:36
36F→: ssse3+rep 0m0.211s 0m0.219s 0m0.211s04/11 01:36
37F→:在上述的E5410搭配i686實作,確實發生類似原PO所述的狀況;04/11 01:36
38F→:而稍早的glibc版本(ex:2.7),並無i686 multiarch的方式,04/11 01:37
39F→:且i586和i686的實作在進版時,也常有修改.04/11 01:37
40F→:怎樣的搭配,會發生原PO的情況,也許都需要實測才可得知吧.04/11 01:38
42F推:根據大家推測應該是 alignment 的問題, 我把原PO程式的04/11 02:12
43F→: char source[size], destination[size];04/11 02:12
44F→:修改為04/11 02:12
45F→: char data[65536*4];04/11 02:13
46F→: char *source=data, *destination=data+65536*2;04/11 02:13
47F→:重複同樣的測試, 結果時間大約都是 size:65536 那行時間04/11 02:13
48F→:正負 2% 之內. 所以我想 alignment 的推測相當合理;04/11 02:13
49F→:但有個疑問是, E5410搭ssse3+rep看來似乎很反常?04/11 02:13
50F→:回uid88, 我是因為不了解, 才用這樣的笨方法呀...04/11 02:15
8F推:樓上可以 google: codeblock wiki 和 devc wiki 了解一下.04/03 14:57
20F推:對不起, 我眼殘了, 請忽略我前面的推文.04/07 12:51
2F推:樓上, 不支援的訊息, 只是 codepad.org 附加 ISO C++ 的限制,03/27 15:37
3F→:而非 UVa 的限制, 否則就是 CE 而非 WA 了.03/27 15:41
4F推:問題在於Line34的 i*i<MAX; 如果MAX=100,那i=11時就跳出了.03/27 15:44
4F推:從組語來學 C/C++ , 這恐怕不是一般人做的事...03/25 22:08
5F推:當程式有了上下文, 又開了最佳化, 是否還有差異就難說了.03/25 12:30
6F推:這 9.69999993 的數值似乎只有 float 的精度而非 double ??03/25 12:43
1F推:若是64位元電腦,可能是發生資料錯亂,而不是堆積損毁程式掛掉;03/18 18:37
2F→:反而是32位元電腦搭上double,造成後面資料讀超出配置範圍掛掉.03/18 18:38
9F推:抱歉, 一時沒想清楚, 以為64位元搭配int只是指標指的範圍太小,03/19 12:44
10F→:在data內重疊, 可能重覆蓋寫資料, 造成資料錯亂而已; 沒考慮到03/19 12:45
11F→:讀取資料時, 會蓋寫到 data[i], 而可能讓 data[i] 指向錯誤;03/19 12:45
12F→:當然, 若運氣超好, 讀進 (&data[i]) 的資料值恰巧指向合法位址03/19 12:45
13F→:也可能純粹搞亂資料而已, 而未造成 segfault.03/19 12:46
14F→:相對32位元搭配double, 則是在設定 data[i] 指標時就超出範圍;03/19 12:46
15F→:但如果在讀入 data 前又額外配置記憶體, 也可能後續的讀取只是03/19 12:46
16F→:蓋寫後來配置區域的資料, 而不會發生 segfault.03/19 12:47
17F→:至於堆積損毁, 其實是原PO附圖中的詞, 也就是heap corruption,03/19 12:47
18F→:有幾種情況, 其中之一就是指標錯誤又去存取資料而發生的.03/19 12:48