SORU
22 ŞUBAT 2010, PAZARTESİ


C ve C Sendikaların amacı

Konforlu bir önceki sendikalar kullandım. bugün this post okuduğumda dehşete kapılmıştım ve bu kodu bilmek geldi

union ARGB
{
    uint32_t colour;

    struct componentsTag
    {
        uint8_t b;
        uint8_t g;
        uint8_t r;
        uint8_t a;
    } components;

} pixel;

pixel.colour = 0xff040201;  // ARGB::colour is the active member from now on

// somewhere down the line, without any edit to pixel

if(pixel.components.a)      // accessing the non-active member ARGB::components

aslında tanımsız davranış I. e. birliğin bir üyesi son okuma tanımsız davranışlara neden yazılı. Eğer bu sendikalar amaçlanan kullanımı değil ise, nedir? Birileri özenle bana açıklayabilir mi lütfen?

Güncelleme:

Geriye dönüp baktığımda birkaç şeyi açıklığa kavuşturmak istedim.

  • Bu sorunun cevabı C ve C için de geçerli değil mi ; cahil genç halime C ve C olarak etiketlendi .
  • C kesin olmayan aktif sendika üyesi teftiş/erişim çağıran diyemedim 11 standart tanımsız/belirsiz ile Temizleme sonra uygulama tanımlı/. Bulabildim §9.5/1:

    Eğer bir standart düzen Birliği içeren birçok standart düzeni yapılar paylaşan bir ortak başlangıç sırası, ve eğer bir nesnenin bu standart düzen Birliği türü içeren bir standart düzeni yapılar, izin verilen teftiş ortak ilk sıra herhangi bir standart düzeni yapı üyeleri. §9.2/19: İki standart düzeni yapılar ortak bir başlangıç sıra, eğer ilgili üye var düzeni ile uyumlu bir tür ya da ne üye bir bit alanı ya da her ikisi de bit-fields ile aynı genişlik için bir sıra, bir veya daha fazla ilk üyeleri.

  • C ise, (C99 TC3 - DR 283 sonrası) bunu yapmak için yasal olarak (bunu söylerkenthanks to Pascal Cuoq). Ancak, yapmak için çalışmakhala tanımsız davranışlara yol açabilireğer değer okumak geçersiz olursa, (sözde "tuzak gösterimi") ile okunur türü için. Aksi halde, değeri uygulama tanımlı oku.
  • C89/90 bu belirsiz davranış (Ek J) altında seslendi ve K&R kitap uygulama tanımlı olduğunu söylüyor. K&R dan alıntı:

  • Bu birliğin amacı - yasal olarak pek çok türde herhangi tutabilecek tek bir değişkendir. kullanımı tutarlı olarak [...] çok uzun: türü alınan yazın en son saklanmalıdır. Programcı hangi türü şu anda bir birlik içinde saklanır takip etmek sorumluluğu; sonuçları eğer bir şey bir tür olarak saklanır ve başka bir karşı sürdürülen mücadelede ise bağımlı uygulanması.

  • Stroustrup TC den PL (vurgu benim) ayıklayın

    Sendikalar kullanımı veri compatness için önemli olabilir [...]bazen "tipi dönüşüm . için kullandı ".

Her şeyden önce, bu soruyu benim sormam beri değişmeden kalan () standart sağlar ne sendikaların amacı anlayış bir niyet ile değil, poz verdiE. g. Kod yeniden kullanım için miras kullanarak, tabii ki, C standardı tarafından izin verilir, fakat it wasn't the purpose or the original intention of introducing inheritance as a C language feature. Bu Andrey cevabı kabul edilen biri olarak kalmaya devam ediyor nedeni budur.

CEVAP
22 ŞUBAT 2010, PAZARTESİ


Sendikaların amacı oldukça açıktır, ama nedense insanlar sık sık onu özlüyorum.

Birliğin amacı budurbellek kurtarmak içinfarklı zamanlarda farklı nesneleri saklamak için aynı bellek bölgesini kullanarak.İşte bu kadar.

Bir otel odası gibidir. Farklı insanlar örtüşmeyen belirli bir süre içinde yaşıyorum. Bu insanlar hiç karşılaşmadığım, ve genellikle birbirleri hakkında hiçbir şey bilmiyorum. Tarafından düzgün bir şekilde yönetilmesi, zaman-paylaşım odası (örn yaparak farklı insanlar yok olsun atanan bir oda aynı anda), bir nispeten küçük bir otel. konaklama için bir nispeten büyük sayıda insan, ne oteller var.

Aynen Birliği yapıyor. Eğer programınızda çeşitli nesneler örtüşmeyen değer-yaşam değerleri tutan biliyorsanız, o zaman "" bu bir birlik içine nesneleri ve böylece bellek kaydedin. birleştirebilirsiniz Bir otel odası gibi en fazla bir "" zaman, birlik vardır, en fazla bir "" program zaman. her an aktif bir üye her an kiracı aktif sadece Sadece "üyesi okuyun." aktif Diğer üye içine yazarak "" durumu diğer üye için. aktif geçin

Nedense Birliği bu asıl amaç" tamamen farklı bir şey: bir birliğin bir üyesi yazılı ve daha sonra başka bir üye ile inceleniyor. "geçersiz var Bellek yeniden yorumlanması bu tür sendikalar için geçerli değil. Genellikle tanımsız davranışlara yol açar.

DÜZENLEME:Bellek yeniden yorumlanması amacıyla (bir üye yazma ve sonra başka bir okuma yani) kullanarak sendikaları sonunda C99 standart Teknik Corrigendums bir yasal yapıldı. Artık resmen TAMAM C. Ancak, resmen bu bir tuzak temsili okuma girişimi tarafından tanımsız davranış içine çalışan sizi korumak değil unutmayın.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • atKristaBradford

    atKristaBrad

    4 Aralık 2010
  • Matthew Pearce

    Matthew Pear

    9 AĞUSTOS 2009
  • wowchick16

    wowchick16

    17 Mart 2007