2013-02-20 21 views
5

Bu hem C hem de C++ için teorik bir sorudur.Otomatik değişkenlerin tahsis alanını C/C++ cinsinden değiştirmek mümkün müdür?

ben oldukça basit tanımlanmış olan bir 4x4 matris tipi vardır:

typedef float Matrix44[16]; 

Ayrıca, örneğin, bir parametre olarak bir Matrix44 almak birçok yöntem vardır: Aynı zamanda var

bool matrixIsIdentity(Matrix44 m); 

geniş bir bellek alanı yığının üzerine önceden tahsis edilen ve sonra bu önceden getirilen belleğe ilişkin tahsisleri elle yöneten özel bir bellek ayırma şeması. Bu nedenle kendi uygulamalarım ile malloc/new'u değiştirdim/aşırı yükledim. Sorun, her iki özel malloc ve new, doğası gereği, bir işaretçi değil, bir nesne döndürür.

Normalde, sadece aşağıdakileri: Keşke gibi

// Method 1 
1] Matrix44 mat = { ... }; 
2] bool res = matrixIsIdentity(mat); 

Ancak satır 1 değil benim özel hafıza alanında istife mat tahsis etti. Alternatif: Burada

// Method 2 
1] Matrix44 *mmat = myMalloc(...); 
1a] Matrix44 *nmat = new ... 
2] bool res = matrixIsIdentity(*mat); 

Sorunum çöp için KQUEUE operatörleri ile benim koduna sahip olması nedeniyledir. Şimdi bir seçenek Matrix44* almak için tüm yöntemleri yeniden yazmak olurdu, ancak, bu teorik olduğu gibi, bir seçenek olmadığını varsayalım.

Bu nedenle benim sorum şu olur: Method 1 Line 1'da olduğu gibi C ve/veya C++ otomatik değişkeni bildirmenin bir yolu var mı, yoksa alternatif bir ayırma şemasına sahip mi (Method 2 Line 1'da olduğu gibi)?

( Bu derleyici ilgili tartışma kapsayabilir takdir ama bu etki etiketleri eklenir değil) mümkün değildir, otomatik değişkenler esas yığını olan

+2

Lütfen bunu yanlış anlama, ama umarım bu mümkün değildir. İşaretçi gibi görünmüyorsa, işaretçi gibi davranmamalı. Tabii ki, C++'da işler her zaman çok net değildir, heh. – unwind

+0

Sanırım, her şeyden önce, kullandığınız işletim sistemine bağlı. Bellek düzenini yeniden düzenlemek için linker ile keman yapabileceğini tahmin ediyorum. Ama emin olmaktan çok uzakım ... –

+2

Gerçekten 'Matrix44''ü bir parametre olarak kullanmamalısınız; bu çok pahalı. Bunun yerine bu tür parametreleri “const Matrix44 &” olarak bildirin. Bu, belki de matrisleri ilk sırada yığına yerleştirme arzunuzu azaltabilir mi? –

cevap

4

. Ama yapıcının içinde ne istersen yapabilirsin. Yani Matrix44'iniz, "özel" belleğinizi işaret edecek olan Matrix44Impl gibi ince bir sarıcı olacak.

+0

Aslında onlar tahsis edildi n herhangi bir şey olabilir n otomatik depolama, ama evet, çoğu zaman bu yığın. – sharptooth

+0

@sharptooth, yığınının kullanılmadığı bazı örneklerin olduğunu ima ettiğinden * çoğu zamanın * nereden geldiğini merak ediyorum. Bunu uygulamak için yığını kullanmayan bir derleyici biliyor musunuz? – thang

+1

@thang "Yığın" ın bozukluğuna bağlıdır. C++ standardı az çok otomatik değişkenlerin * A * yığınına ayrılmasını gerektirir, ancak tüm donanımların bir donanım yığını yoktur ve birçok kişi bu ikisi karıştırır. –

2

Kendisi değil% 100 tam olarak ne isteyebilir ama bir referans kullanarak istediğini benziyor ve eğer doğru anlamak, az ya da çok ayırt edilemez dan istediğini davranacaktır:

Matrix44& mmat = *new Matrix44(...); // or *myMalloc() or whatever 

mmat.Rotate(45.0); 
bool res = matrixIsIdentity(mat); 
... 
delete &mmat; // or myFree(&mmat) or something similar 

new numaralı adreste bulunan ve adres-işlecini delete numaralı adrese not edin, ki bu biraz kabul edilir, ancak neden sözdizimsel/anlamsal olarak yanlış olacağını anlamıyorum. Derleyici bunu çok iyi kabul ediyor ve "çalışıyor". Yine de böyle bir şeyi yapmamaya şiddetle tavsiye ederim. “İyi” çalışsa bile, yanıltıcıdır. Kod yaptıklarına benzemeli ve göründüğü şeyi yapmalıdır. Bu kod yok. "Bu yığının yaşar benziyor

şey gerekli olmamalıdır (veya, hatta mümkünse!) delete teslim edilecek ve bir şey asagilik yapar tartışmasız kod bile eğer "iş" değil gerçekten does iyi çalışıyor".