[問題] 判斷是否在同一行程式

看板C_and_CPP作者 (Gloria)時間12年前 (2013/06/04 08:44), 編輯推噓4(4028)
留言32則, 11人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) C++ 問題(Question): 是這樣的,因為一些原因我需要在函數裡判斷這個函數是否在同一行程式裡 被呼叫超過一次 具體例子是這樣: 我想要implement Matlab的取子矩陣的函數 i.e. 一個矩陣A,取他的A([1,2,3],[1,3,4]) 第1 2 3 row 和 第1 3 4 column 但我希望不要每呼叫一次這個子矩陣函數就去new一個新的記憶體空間給這個 子矩陣回傳 [因為我這樣做似乎會大大的增加執行時間] 於是我在這個子矩陣函數裡使用了static的matrix記憶體空間 永遠re-use同一塊記憶體不去重新做記憶體配置 但是這樣子做,我在同一行程式裡呼叫這個函數兩次以上的時候就會出問題 例如說 A([1,2],[1]) + A([3,4],[2]) 會因為在子矩陣函數裡只有一個static記憶體,而導致在+之前, 先被呼叫的子矩陣被後來呼叫的子矩陣洗掉 我目前想一個straightforward solution就是說 判斷他是否在同一行程式裡面,是的話就再開一個static matrix 但我不知道怎麼判斷 不曉得能否給些指引,或是有其他更好的做法來處理這樣的問題? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.96.91.150

06/04 09:02, , 1F
...子函數是啥 -.- ?
06/04 09:02, 1F

06/04 09:22, , 2F
我不知道 你可以叫他函式 就是一個自己寫function
06/04 09:22, 2F

06/04 10:33, , 3F
C沒有子函數(函數裡面再寫函數)。
06/04 10:33, 3F
OK, 我把"子"去掉~

06/04 10:43, , 4F
看不太懂你想要做什麼....
06/04 10:43, 4F
是有點複雜 ※ 編輯: GSXSP 來自: 140.96.158.68 (06/04 10:52)

06/04 12:11, , 5F
事先宣告個變數然後傳reference進去不就得了
06/04 12:11, 5F
外面宣告變數也是可以,但是使用起來就不方便 沒辦法像Matlab那樣直接 A([1,2],[1]) + A([3,4],[2])

06/04 13:01, , 6F
如果你row,col取的數量不同,要如何快取?
06/04 13:01, 6F

06/04 13:02, , 7F
第一次A([1,2,3],[1,3,4])第二次A([1,2],[1])
06/04 13:02, 7F
我會用size adaption的方式調整裡面那個static Matrix 如果需要比較大的size就再給他新的空間 如果這次使用是要比較小的size那就把row和col改掉,但原來比較大的記憶體還是在 下次又變大的話就把row和col改回來

06/04 13:05, , 8F
而且你不是要判斷是否在同一行, 而是那個矩陣是否用過
06/04 13:05, 8F
如果不同行的話就沒關係 例如說 B = A([1,2,3],[1,3,4]) + C; X = A([1,2],[1]) + D; 這樣執行起來也不會有什麼問題 因為同一行只需要一個temp值 下一行那個temp值就沒有用了 ※ 編輯: GSXSP 來自: 140.96.91.150 (06/04 15:39)

06/04 23:47, , 9F
應該說 你需要的是管理那塊記憶體 不用知道在不在同一行
06/04 23:47, 9F

06/04 23:48, , 10F
就是說 你要考慮多個使用的狀況
06/04 23:48, 10F

06/05 10:10, , 11F
但目前我所想到的會有問題的case就是"在同一行"~
06/05 10:10, 11F

06/05 10:11, , 12F
還是說這樣的case有另外的什麼特徵呢?
06/05 10:11, 12F

06/05 11:02, , 13F
const Matrix& m = A(..); m + A(...)
06/05 11:02, 13F

06/05 11:03, , 14F
甚至 const Matrix& m = A(..); const Matrix& n = A(...);
06/05 11:03, 14F

06/05 11:15, , 15F
分兩行以上做當然也可以 目前我就是這樣做的
06/05 11:15, 15F

06/05 11:16, , 16F
只是這樣我就需要在外面allocate幾個static matrix來用
06/05 11:16, 16F

06/05 11:17, , 17F
但我不太知道 const Matrix & 這樣做會是什麼意思~~
06/05 11:17, 17F

06/05 11:18, , 18F
可以不需要allocate空間給m嗎??
06/05 11:18, 18F

06/05 11:21, , 19F
喔喔~我想我懂一點了;有點像pointer;一直不是很懂&各處用法
06/05 11:21, 19F

06/05 11:21, , 20F
我試試看 謝謝
06/05 11:21, 20F
好像還是不行耶 const Matrix& m = A(..); 這樣子m會是 A(..) 這個函數回傳來的東西的alias 也就是我裡面那個static Matrix的alias 再去做 const Matrix& n = A(...); 雖然m是const 但因為裡面那個static matrix在Matrix& n = A(...); 會被修改 m也就變了 而且這樣依舊m=n, 兩個都是裡面那個static Matrix的alias 我測試的結果 A = [1 2;3 4]; const Matrix& m = A.get_row(0); (想要的是[1 2]) const Matrix& m = A.get_row(1); (想要的是[3 4]) m + n的結果卻是 [6 8]; 還是說我裡面的static Matrix這樣的做法不好, 有什麼別的方式來配合const Matrix& ? ※ 編輯: GSXSP 來自: 140.96.91.150 (06/05 11:47)

06/05 12:01, , 21F
請問你 get_row 怎麼 implement 的?
06/05 12:01, 21F
跟我文中描述的submatrix方式類似,我直接貼code好了 Matrix<T> & get_row(int m) { static Matrix<T> tmp(1,N_col); SizeAdaption(tmp,1,N_col); for(int k=0;k<N_col;k++) tmp[0][k]=A[m][k]; return tmp; } ※ 編輯: GSXSP 來自: 140.96.91.150 (06/05 12:44)

06/05 23:01, , 22F
為什麼要回傳reference, 直接回傳object不行嗎?
06/05 23:01, 22F
回傳object他就必須allocate一份temp Matrix的空間然後copy出去,我測試的結果會很慢 (用Visual C++的Compiler)

06/06 00:05, , 23F
(我給的例子是不在同一行, 但是要用到同一塊記憶體啊..)
06/06 00:05, 23F
對..所以會變[6 8]..我不知道要怎麼解決? 還是說我應該怎麼寫讓他能夠直接用到A本來的記憶體空間,而不是另外開一個static? 但我頂多改row和col,我不知道要怎麼樣修改他 initial pointer的位置和access A(..)[1][2]的方式 (新的submatirx的 [1][2]) ? ※ 編輯: GSXSP 來自: 140.96.91.150 (06/06 10:21)

06/06 13:21, , 24F
可以舉一些例子嗎,我猜你只想修改M的部分內容,對嗎?
06/06 13:21, 24F
也沒有想要修改他,就是想要取出來,可以修改就更好了 像是若是寫Matrix B = [0 0] a.GetRow(0)=B 可以讓a變成 [0 0; 3 4]的話就更好了 但如上述我不知道要怎麼讓 a.GetRow(0)這個pointer的intitial position和access的方式改變 [ 我的Matrix是用T**implement 如果是取submatrix的話,我不知道他在access element的時候,我要怎麼樣讓 某些記憶體位置(某些col,row) 從他眼中"消失" @@ 就是說 A(..)[m][n] 必須是用新的submatrix來算的m和n, 但記憶體位置卻要是本來A裡面的,也就是會跳著算,跳過沒取的row和col ]

06/06 13:23, , 25F
Matrix a, r0, r1; r0=a.GetRow(0); r1=a.GetRow(1);
06/06 13:23, 25F

06/06 13:24, , 26F
a=[1 2; 3 4;] 你覺得r0+r1應該是 [4 6]?
06/06 13:24, 26F
對~就是想跟Matlab的一樣 r0就是第一排row這個2x1的Matrix [1 2],而r1就是第二排row這個2x1的Matrix [3 4] 所以r0+r1 = [4 6] ※ 編輯: GSXSP 來自: 140.96.91.150 (06/06 14:08) ※ 編輯: GSXSP 來自: 140.96.91.150 (06/06 14:17)

06/06 20:35, , 27F
我覺得照你的需求應該沒辦法避免掉return object
06/06 20:35, 27F

06/06 20:35, , 28F
但是可以想辦法減少copy object時的overhead.
06/06 20:35, 28F

06/06 20:36, , 29F
有試過改寫Matrix的copy ctor嗎?
06/06 20:36, 29F
我其實不是很確定他慢的原因 對我來說是因為return object時他需要allocate一個temp記憶體來接,所以才會慢 他allocate好之後的 copy value 的動作應該不太佔時間 我目前 "=" 的做法就是 Matrix<T>& operator=( const Matrix<T>& A1 ) { if( &A1 != this )// Equal to itself { if(N_row == A1.get_N_row() && N_col == A1.get_N_col()) { for(size_t m=0;m<N_row;m++) for(size_t n=0;n<N_col;n++) A[m][n]=A1[m][n]; } else { //cout<<"Avoid this (=) is better"<<endl; build( A1.N_row, A1.N_col, A1.A ); } } return *this; } 大部分情況都會進if( N_row == A1.get_N_row() .....) 包含return object時候的copy 所以就是直接把value給過去 不曉得這一部分會是原因嗎? ※ 編輯: GSXSP 來自: 1.169.171.80 (06/06 22:01)

06/06 22:24, , 30F
你 B = A() + C 時 B 不用 alloca 空間存嗎?要的話是不是
06/06 22:24, 30F

06/06 22:25, , 31F
可以用 rvalue/move semantic 來解決?
06/06 22:25, 31F

06/07 10:42, , 32F
要 什麼是rvalue/move semantic @@ 有沒有網頁有詳細用法@@?
06/07 10:42, 32F
文章代碼(AID): #1HhJXtee (C_and_CPP)