Clang llvm a 2 copy konstruktory – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Clang llvm a 2 copy konstruktory – C / C++ – Fórum – Programujte.comClang llvm a 2 copy konstruktory – C / C++ – Fórum – Programujte.com

 

vitamin+8
Grafoman
19. 1. 2013   #1
-
0
-

Mam nasledovnu strukturu:

struct X{
	bool a, b;
	
	X(const X& x){a = x.a; b = x.b;}	//kopirovaci konstrutor
};

// + main atd...

Preco clang generuje 2 konstruktori (size pri -O1, ale aj tak), po prelozeni cez:
clang -cc1 main.cpp -emit-llvm -O1

%struct.X = type { i8, i8 }

//1. konstruktor ktory vola 2.
define linkonce_odr void @_ZN1XC1ERKS_(%struct.X* nocapture %this, %struct.X* nocapture %x) unnamed_addr nounwind align 2 {
  tail call void @_ZN1XC2ERKS_(%struct.X* %this, %struct.X* %x)
  ret void
}

//2. konstruktor (tento inicializuje premenne)
define linkonce_odr void @_ZN1XC2ERKS_(%struct.X* nocapture %this, %struct.X* nocapture %x) unnamed_addr nounwind align 2 {
  %1 = getelementptr inbounds %struct.X* %x, i64 0, i32 0
  %2 = load i8* %1, align 1, !tbaa !0
  %3 = and i8 %2, 1
  %4 = getelementptr inbounds %struct.X* %this, i64 0, i32 0
  store i8 %3, i8* %4, align 1, !tbaa !0
  %5 = getelementptr inbounds %struct.X* %x, i64 0, i32 1
  %6 = load i8* %5, align 1, !tbaa !0
  %7 = and i8 %6, 1
  %8 = getelementptr inbounds %struct.X* %this, i64 0, i32 1
  store i8 %7, i8* %8, align 1, !tbaa !0
  ret void
}

Dalej by ma zaujimalo podla coho su generovane nazvy ako _ZN1XC2ERKS_, _ZN1XC1Ev, ..

Vie dakto?

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
crazy
~ Moderátor
+10
Grafoman
19. 1. 2013   #2
-
0
-
Nahlásit jako SPAM
IP: 147.32.31.–
All you need is vision and time.
ondra.holub+1
Stálý člen
19. 1. 2013   #3
-
0
-

Teď jenom spekuluji: Může to souviset s tím, že copy constuctor lze někdy vyoptimalizovat. Např. u funkce, která vrací instanci hodnotou a tato hodnota je vytvořena voláním konstruktoru někde blízko return z té funkce. Pak lze tu novou instanci vytvořit zrovna tam, kde se vyrábí:

struct X
{
    int a_;
    int b_;

    X(int a, int b): a_(a), b_(b) { }
};

X genX()
{
    return X(4, 5);
}

int main()
{
    X x = genX(); // Tady musi byt syntakticky pristupny copy ctor, ale muze se vyoptimalizovat
}

Ale stejně tak to může být něčím úplně jiným, protože do llvm bohužel nevidím.

Nahlásit jako SPAM
IP: 212.96.189.–
vitamin+8
Grafoman
19. 1. 2013   #4
-
0
-

#2 crazy
Dik, c++ ABI nemam vobec nastudovane, budem si to musiet pozret.

#3 ondra.holub
Praveze tie konstruktori maju uplne rovnake prototipy, 1. nerobi nic ine len vola druhy konstruktor.

Len pre zaujimavost, ten tvoj priklad sa skompiluje na daco taketo:    

struct X
{
    int32_t a_;
    int32_t b_;

    X(int32_t a, int32_t b): a_(a), b_(b) { }
};

/*
X genX()
{
    return X(4, 5);
}
*/
uint64_t genX(){
    alloca X x;	//alokuje miesto na stacku
    X(&x, 4, 5)	//zavola konstruktor
    return (uint64_t)x;
}

int main()
{
    X x = (X)genX(); 
}
Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 68 hostů

Podobná vlákna

Konstruktory — založil robin

C# konstruktory — založil Kartmen

Třída, konstruktory — založil JakeBuchar

Dědění java konstruktory — založil elix

C++ copy — založil Old Spice sahara

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý