2016-03-24 13 views
3

GCC veya Clang'da çalışabilmesi için MSVC için yazılmış bazı C++ Kodlarını dönüştürmeye çalışıyorum.UNALIGNED MSVC'ye özel kod taşınabilir C++ koduna dönüştürülüyor mu?

kusurlu kelime

pData

HIZALANMAMıŞ olan LPCBYTE

kod örneği geçerli:

INT8 some8Value = *(UNALIGNED INT8 *)&(pData[offset]); 

INT64 some64Value = *(UNALIGNED INT64 *)&(pData[offset]); 

ben mantıklı ne anlıyorum bu c ode yapmak istiyor, işaretçiden pData + ofsetini gösteren 1 bayt okumak ister.

İkincisi, pData + offset işaretçisinden 8 bayt okuyor.

Kafa karıştırıcı kısım, neden bir UNALIGNED. 1 bayt okumak her zaman hizalı olduğunu düşündüm. Ya da kodu bir şekilde yanlış okuyup duruyor muyum?

INT8 part1 = pData[offset]; 
INT8 part2 = pData[offset + 1]; 
... 

Sonra INT64 durumda 8 parça (örneğin) birleştirir:

Bunu yapmanın çapraz platform yolu takip mi?

+0

8 bireysel sekizli okuyorsunuz ('pData',' INT8 * 'olduğunu varsayarak) ve uygun bir INT64'e uygun bit-manip ile birleştiriyor musunuz? Eğer öyleyse, evet eğer UINT8'i kullanmasam da, uygun şekilde yapılırsa ve taşınabilir. Kendine dikkat etmen gereken tek şey işaret bitine geçmek. Doğru yapmak zor olabilir. Yine de bu kadar yer var? – WhozCraig

+0

@WhozCraig pData, LPCBYTE'dir.İkinci bölümde, bu 8 baytlık tamsayıyı oluşturabilecek kodu nasıl yazacağımı önermeye çalışıyorum. Burada yardım arıyorum, eğer yolum yanlışsa, nasıl yaparım? – halivingston

+0

Frankie'nin cevabı, btw ile, yanlış hizalı veriler üzerinde kusacak olan donanıma koymaya niyetiniz olmadığını varsayardım. Intel bunun için çok bağışlayıcı olabilir. Büyük Mavi * değil *. Bu konuda Sparc da değil. – WhozCraig

cevap

2

Bu, Itanium işlemcileri için derleme yaparken __unaligned ve diğer tüm CPU'lar için hiçbir şey ifade etmeyen bir makrodur. MSDN (https://msdn.microsoft.com/en-us/library/ms177389.aspx @) :

Eğer __unaligned modifiye edici ile bir gösterici beyan derleyici işaretçi adresleri veri hizalanmamış olduğu varsayılmaktadır. Sonuç olarak, bir Itanium İşlemci Ailesi (IPF) bilgisayarını hedefleyen bir uygulama için, derleyici, bir defada ayarsız veriyi bir bayt okuyan bir kod üretir. Eğer, ister kodunda her yerden kaldırmak durumunda,

#define UNALIGNED 

Veya: Senin durumunda

basitçe başlığında hiçbir şey onu eşittir.

DÜZENLEME: ARM işlemcilerde özellikle __attribute__ ((__packed__)) olarak, hizalanmamış veri için GCC için o existo belirtmek için eleme __packed kullanılabilir, ancak MSVC için yok. İkincisi için tek seçenek #pragma pack(1) olup, bununla birlikte yapılarla sınırlı olması gerekmektedir.
SO cevabı Visual C++ equivalent of GCC's __attribute__ ((__packed__)) hakkında daha fazla bilgi.

+0

Aslında soruyorum çünkü bu kod, ARM üzerinde Windows 10'da çalışacak ve ayrıca, erişilmemiş erişimlerin başarısız olabileceği Linux ARM'ye ek olarak ... Görünüşe göre bazı Linux dağıtımları, hizasız erişim için şeffaf bir şekilde bir şey yapmıyor. Bu nedenle, kodu herhangi bir koşulda okumayı nasıl değiştirebileceğinizi yanıtlayabilseydiniz ... harika olurdu – halivingston

+0

Değiştirici, Itanium işlemciler ailesine özeldir. ASAIK'in diğer tüm işlemcileri için erişim talimatlarını değerlendirmeye gerek yoktur. Bir ARM işlemcisinde, 'INT8' shoulld'e erişim bildirimi, bayt hizalanmış veriler için talimatlar üretmeye yeterlidir. –

İlgili konular