我有一個Matrix4D應該傳遞給glLoadMatrixf。爲了克服p/invoke開銷(即每一次鎖定,編組等),我使用指針而不是通常的數組。所以我有兩個問題。指向C#/ CLR中的valuetype的中間值是否安全?
Matrix4D基於copypasted類。它已經過測試並且可能進行了一些優化 - 不想重新發明輪子(同樣我也在數學上)。無論如何,該類使用16個字段,而不是1個固定數組(該類是我在C#1.0時代編寫的)。佈局是順序的,所以GetPointer方法只是獲得指向第一個字段的指針。問題是:會有一些填充問題嗎?我的意思是,例如,運行時將float擴展爲double,以便將一組字段作爲數組索引來獲取垃圾。或者順序佈局是否阻止了規格?還是應該嚴格遵守固定陣列?
第二個問題是優化程序可能進行的更改。矩陣是一個值類型,在其上調用float * GetPointer()。恐怕優化器可能會重新排列代碼,GetPointer會指向一些垃圾。
例如:
GL32NativeMethods.glLoadMatrixf((mat1 * mat2).GetPointer());
它是安全的呢,還是不?目前我正在這樣做(雖然我不確定):
Matrix4D tmp = mat1 * mat2;
GL32NativeMethods.glLoadMatrixf(tmp.GetPointer());
是否有其他可能的解決方案來解決這個問題? P.S.在調用glLoadMatrixf之後,指針不是必需的。
UPD
我擔心的是,在調用GetPointer()和glLoadMatrixf()之間的值可以通過優化器被丟棄(如我想):
浮子* F = mat.GetPointer ();
//這裏優化器決定放棄mat變量,因爲它不再被使用。
//也許它現在填充與其它輔助值墊的存儲區域
GL32NativeMethods.glLoadMatrixf(F)(對P /調用,例如); //引用丟棄了數據。
你不能沒有固定指針,所以你應該沒問題。 – Gabe 2010-12-17 06:07:43
@Gabe:當被調用的方法返回時,從方法返回的指針不會讓其對應的對象仍然固定。但是,堆棧中分配的值對象不需要被固定。 – cdhowie 2010-12-17 06:10:01
Matrix4D是一個結構體。 – YetAnotherCodemonkey 2010-12-17 06:10:24