SORU
3 AĞUSTOS 2011, ÇARŞAMBA


Kurucu sembollerden çift emisyon

Bugün, ya g nm...kurucu tanımlar kütüphanelerde iki giriş var görünüyor hakkında çok ilginç bir şey keşfettim.

Bir başlık thing.hpp var:

class Thing
{
    Thing();

    Thing(int x);

    void foo();
};

15**:

#include "thing.hpp"

Thing::Thing()
{ }

Thing::Thing(int x)
{ }

void Thing::foo()
{ }

Ben bu derleme:

g   thing.cpp -c -o libthing.a

Sonra, nm koşuyorum:

%> nm -gC libthing.a
0000000000000030 T Thing::foo()
0000000000000022 T Thing::Thing(int)
000000000000000a T Thing::Thing()
0000000000000014 T Thing::Thing(int)
0000000000000000 T Thing::Thing()
                 U __gxx_personality_v0

Gördüğünüz gibi, Thing kurucular hem de oluşturulan statik kitaplıkta iki girişleri ile listelenmiştir. Benim gcc sadece bir sorun değil mi yani g 4.4.3, ama aynı davranışı clang, olur.

Bu görünen herhangi bir sorun neden olmaz, ama merak ettim:

  • Neden iki kez tanımlanmış kurucular listesinde adı var mı?
  • Neden bu sembol __" sorunlar? "birden çok tanımı neden yok

EDİTCarl için, C tartışmadan çıktı:

%> nm -g libthing.a
0000000000000030 T _ZN5Thing3fooEv
0000000000000022 T _ZN5ThingC1Ei
000000000000000a T _ZN5ThingC1Ev
0000000000000014 T _ZN5ThingC2Ei
0000000000000000 T _ZN5ThingC2Ev
                 U __gxx_personality_v0

Gördüğünüz gibi...aynı işlevi hala oldukça meraklı olan birden fazla semboller oluşturuyor.

Ve hazır başlamışken, burada oluşturulan derleme bir bölüm

.globl _ZN5ThingC2Ev
        .type   _ZN5ThingC2Ev, @function
_ZN5ThingC2Ev:
.LFB1:
        .cfi_startproc
        .cfi_personality 0x3,__gxx_personality_v0
        pushq   %rbp
        .cfi_def_cfa_offset 16
        movq    %rsp, %rbp
        .cfi_offset 6, -16
        .cfi_def_cfa_register 6
        movq    %rdi, -8(%rbp)
        leave
        ret
        .cfi_endproc
.LFE1:
        .size   _ZN5ThingC2Ev, .-_ZN5ThingC2Ev
        .align 2
.globl _ZN5ThingC1Ev
        .type   _ZN5ThingC1Ev, @function
_ZN5ThingC1Ev:
.LFB2:
        .cfi_startproc
        .cfi_personality 0x3,__gxx_personality_v0
        pushq   %rbp
        .cfi_def_cfa_offset 16
        movq    %rsp, %rbp
        .cfi_offset 6, -16
        .cfi_def_cfa_register 6
        movq    %rdi, -8(%rbp)
        leave
        ret
        .cfi_endproc

Oluşturulan kod......aynıdır.


EDİT: Yapıcı aslında çağrılır, bu Thing::foo() değişti:

void Thing::foo()
{
    Thing t;
}

Oluşturulan derleme

.globl _ZN5Thing3fooEv
        .type   _ZN5Thing3fooEv, @function
_ZN5Thing3fooEv:
.LFB550:
        .cfi_startproc
        .cfi_personality 0x3,__gxx_personality_v0
        pushq   %rbp
        .cfi_def_cfa_offset 16
        movq    %rsp, %rbp
        .cfi_offset 6, -16
        .cfi_def_cfa_register 6
        subq    $48, %rsp
        movq    %rdi, -40(%rbp)
        leaq    -32(%rbp), %rax
        movq    %rax, %rdi
        call    _ZN5ThingC1Ev
        leaq    -32(%rbp), %rax
        movq    %rax, %rdi
        call    _ZN5ThingD1Ev
        leave
        ret
        .cfi_endproc

Tam bir nesne oluşturucu çağrılırken.

CEVAP
3 AĞUSTOS 2011, ÇARŞAMBA


GCC follows39** olduğunu ilan ederek başlayacağız.


ABİ, senin için parçalanmış adına göre Thing::foo() kolayca ayrıştırılır:

_Z     | N      | 5Thing  | 3foo | E          | v
prefix | nested | `Thing` | `foo`| end nested | parameters: `void`

Kurucu isimleri benzer şekilde, aşağıda okuyabilirsiniz. Fark oluşturucu nasıl "ad" verilen değil, ama C bir fıkra yerine:

_Z     | N      | 5Thing  | C1          | E          | i
prefix | nested | `Thing` | Constructor | end nested | parameters: `int`

Ama C1 bu ne? Yinelenen C2 var. Bu nedirdemek?

Peki this is quite simple too:

  <ctor-dtor-name> ::= C1   # complete object constructor
                   ::= C2   # base object constructor
                   ::= C3   # complete object allocating constructor
                   ::= D0   # deleting destructor
                   ::= D1   # complete object destructor
                   ::= D2   # base object destructor

Bekleyin, bu yüzdenbasit? Bu sınıf tabanına sahip. Neden bir var mı"" . tam bir nesne oluşturucu ^strong>vebir "nesne" için her? oluşturucu, temel

  • This Q&A bu aslında bu durumda gerekli olmasa da sadece polimorfizmi destek tarafından bir ürün, benim için anlamına gelir.

  • c filt bu bilgileri demangled çıktısı, but doesn't any more kullanılan unutmayın.

  • This forum post aynı soruyu sorar ve tek yanıt daha iyi GCC imasında hariç cevapolabilirpolimorfizmi dahil olduğunda ve bu davranışın gelecekte düzeltilmesi gereken iki kurucular yayan kaçının.

  • This newsgroup posting kurucular çift emisyonlu bu nedeniyle kesme ayarı ile ilgili bir sorun açıklanır. Sorunun altında yatan polimorfizmi için destek olduğunu bir kez daha belirttiler.

, 45**: aslında

G kurucular ve yıkıcılar iki kopyasını çıkarır.

Genel olarak kurucular üç tipi vardır (ve yıkıcılar).

  • Tam nesne yapıcı/yıkıcı.
  • Temel nesne yapıcı/yıkıcı.
  • Ayrılırken yapıcı/yıkıcı ayırmayı kaldırma.

İlk iki sanal temel sınıflar farklı, dahil.


Bu farklı anlamı seems to be as follows kurucular:

  • "". Tam bir nesne oluşturucu Ayrıca sanal temel sınıflar oluşturur.

  • "Temel nesne oluşturucu". Nesnenin kendisi olarak veri üyeleri ve sivil sanal temel sınıflar oluşturur.

  • "Nesne oluşturucu". ayrılırken Tam nesne yapıcı yaptığı her şeyi yapar, operatör yeni aslında bellek çağırıyor artı...ama görünüşe göre bu genellikle görülmez.

[İlk iki] hiçbir sanal temel sınıflar varsa, özdeş; GCC, yeterli optimizasyonu düzeyde, aslında diğer her ikisi için de aynı kodu simgeler.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Break

    Break

    10 Aralık 2005
  • ghosti66

    ghosti66

    27 AĞUSTOS 2006
  • NLthomas21

    NLthomas21

    20 Mayıs 2008