2016-06-08 62 views
8

Bu C kodu rastladım ve bunu anlamaya çalışıyorum:C hizalama yapıları nasıl yardımcı olur?

typedef long Mtx_t[4][4]; 

typedef union { 
    Mtx_t m; 
    long long int force_structure_alignment; 
} Mtx; 

ilk typedef bir 4x4 matris olarak Mtx_t tanımlar, o kadarını anlıyorum. Ancak Mtx için ikinci yazım, yalnızca önceki türden çağrı yapar ve force_structure_alignment adlı uzun bir uzun int ekler.

Bunun amacı nedir? Neden sadece Mtx'i 4x4 matrisi olarak tanımlayıp onunla yapılmasın?

+1

İlginç bir örnek; Birleşim olduğu için büyüklük en büyüktür; sistemimde hangi uzun [4] [4] 'için 128 bayt olurdu. Diğer alan, sistemimde yalnızca “8” bayt olduğunda. Herhangi bir hizalamaya katkıda bulunmuyor gibi görünüyor. 'Force_structure_alignment' öğesinin, hizalama için kullanılması durumunda diğer türlerden daha büyük olacağını düşünürsünüz. – jacob

+2

Geçerli bir "uzun" sınırda hizalanmak zorunda kalıyorlar. Örneğin, bu 8 bayt, uzun süre 4 bayt olabilir. Bunun neden istenildiği belli değil. Bellek referans performansını iyileştirmek için bir girişim olabilir. Ayrıca, daha büyük bellek erişimlerini gerçekleştirmek için 'Mtx_t' değişkenini' uzun uzun' ile takma girişiminde bulunmak isteyebilirler. –

+1

@jacob: 'Uzun [4] [4]' sadece 'uzun'nın hizalama gerekliliklerine sahiptir, bu yüzden uzun uzunların hizalaması muhtemelen daha katıdır. – user2357112

cevap

4

Adından da anlaşılacağı gibi, long long adresinin adres hizalama gereksinimlerini long yerine, bellekte yerleştirilmek üzere Mtx es zorlamak için çalışıyorlar. Bu işletim sistemi veya işlemci mimarisi tarafından zorunluluklar için önemli olabilir. Google, "Mtx" in muhtemelen "mutex" için kısa olduğunu ve bir C mutex uygulamasının bazı oldukça düşük seviyeli arayüzlerle ilgileneceğini öne sürüyor.

+0

Atomik değerler için makul bir gereklilik, ayrı bir üretim sayacını (ABA'yı önlemek için) tutmak ve çift kelimeli karşılaştırma ve takaslar kullanmaktır. Bu nedenle, sadece iki bitişik ama ayrı uzunluğa ihtiyacınız olsa bile, makine, atomik işlem için boyutunun iki katına hizalanmasını gerektirebilir. –

+0

Mtx'in Matrix olduğunu düşünüyorum, beacause [4] [4] bir matris şekli oluşturur ve Mtx_t'de, 't' bir transformasyon matrisinde olduğu gibi 'transformasyon' anlamına gelebilir. – user3360203

+0

@ user3360203: "mtx_t" için [Google sonuçları] (https://www.google.com/search?q=mtx_t), mutekslerle ilgili, ancak [aramayı hassaslaştırıyor] (https://www.google. com/search? q = mtx_t + force_structure_alignment) muhtemelen "matris" anlamında haklı olduğunuzu gösterir. Ayrıca, bu koda erişim sahibi olmamamız gerektiğini de öne sürüyor; Nintendo 64'ten özel kod gibi görünüyor. – user2357112

2

İşlemci mimarisi ile verimlilik için yapılabilir. Örneğin, Mtx_t boyutu tek bir bayt sayısıysa ve donanımın komut kümesi/bellek mimarisi tek bir adrese erişirken bir maliyet getiriyorsa, tüm Mtx_t kayıtlarınızın adresler için daha uygun adresler arasında oturmasını istersiniz. erişim. Eş işlemcilerde olduğu gibi sabit boyutlu bir bellek bloğuyla çalışmanın da bir gereği olabilir. Yastıklı bir yapı kullanmak bunu yönetmeyi daha kolay hale getirebilir.

burada bu konuda daha fazla bilgi: veri yolu Okuma/yazma için veri taşıyan çip üzerinde bulunmaktadır https://en.wikipedia.org/wiki/Data_structure_alignment

1

. Daha hızlı bellek erişimi için, veriyi birden fazla baytta taşımak için tasarlanmış bu otobüsler örn. 4/8/16 bayt. Ancak bu veri yolu, herhangi bir keyfi adrese ait verileri eşit verimlilikle okuyamaz/yazamaz. Örneğin, 8 baytlık bir veri yolu, 8 baytlık sınırda hizalanmış bir bellekten veri okumak/yazmak için daha hızlı olacaktır. Bu nedenle, yüksek verimlilik için, büyük boyutlu veri/yapının, hızlı erişimin mümkün olduğu şekilde hizalanması önerilir. Örneğinizde, derleyicinin arzu sonucunu vermeyecek yapıları yönetme uygulamasından yararlanarak yapılır. Ancak derleyici, bir değişkenin, örn. gcc 'align' anahtar sözcüğünü kullanır