Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 00:43

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Move-Konstruktor zu oft aufgerufen?

Discussion on Move-Konstruktor zu oft aufgerufen? within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
Logtetsch's Avatar
 
elite*gold: 192
Join Date: May 2009
Posts: 2,227
Received Thanks: 3,262
Move-Konstruktor zu oft aufgerufen?

Abend,

folgendes: es werden 10 Objekte vom Typ 'Foo' erstellt und nach Möglichkeit in einen Vector gepusht. Wieso wird der Move-Konstruktor 35x (insgesamt, sprich: nicht á Objekt) aufgerufen? Weitere Frage: Wenn ich den Move-Konstruktor lösche ( '= delete' ), müsste doch der Kopier-Konstruktor zum Einsatz kommen, jedenfalls war mein Ansatz dies so zu erzwingen. Der Compiler (MSVC) jagt mir dabei eine Fehlermeldung (C2280 - Es wurde versucht, auf eine gelöschte Funktion zu verweisen.) um die Ohren. Was passiert hier?

Code:
#include <iostream>
#include <windows.h>
#include <vector>

class Foo
{
public:
	static UINT copied_count;
	static UINT moved_count;
	static UINT created_count;

public:
	Foo() { std::wcout << L"foo created " << created_count++ << std::endl; };
	Foo(Foo&& obj) { std::wcout << L"foo moved " << moved_count++ << std::endl; }
	Foo(const Foo& obj) { std::wcout << L"foo copied " << copied_count++ << std::endl; }
};

UINT Foo::copied_count = 0;
UINT Foo::moved_count = 0;
UINT Foo::created_count = 0;

int __cdecl main(_In_ int _Argc, _In_count_(_Argc) _Pre_z_ wchar_t ** _Argv, _In_z_ wchar_t ** _Env) 
{

	std::vector<Foo> objVector;
	for (UINT i = 0; i < 10; i++)
	{
		objVector.push_back(Foo());
	}

	std::wcin.get();
	return EXIT_SUCCESS;
}
Logtetsch is offline  
Old 12/23/2016, 00:01   #2
 
elite*gold: 46
Join Date: Oct 2010
Posts: 782
Received Thanks: 525
Erstmal zu dem, dass wenn du den konstruktor mit der rvalue ref = deletest er meckert: Das ist so. Wenn du den nicht deklarierst (dh. nichtmal = deletest) bindet das auf const T&. Wenn du den aber deklarierst (was das mit dem = delete leider tut afaik) dann versucht er den zu nutzen, aber den gibt es ja nicht.

Zu dem 35 mal:
Also warum der mindestens 10mal movet dürfte klar sein. Nur weil dein vector dynamisch ist muss er irgendwann seinen speicher vergrößern. Dabei werden halt die alten objekte in den neuen speicher im besten fall gemovt. Dadurch wird natürlich auch der move konstruktor wieder gecallt. Warum die Zahl bei msvc so hoch ist habe ich kp. Bei clang sind es 24. Also 10 vom hinzufügen und 14 vom neu allokieren vom speicher und die alten darein moven.
th0rex is offline  
Thanks
1 User
Old 12/28/2016, 11:05   #3
 
elite*gold: 225
Join Date: Sep 2014
Posts: 334
Received Thanks: 461
^Das was Lizzi gesagt hat aber 'ne gute Idee, um das selber noch einmal zu überprüfen, wäre das Ganze mal zu singlesteppen.
Cyrex' is offline  
Reply


Similar Threads Similar Threads
Konstruktor bei strings als char pointer
11/14/2015 - C/C++ - 6 Replies
hey, Wie sollten die konstruktoren bei char arrays aussehen (idealfall) z.b man hat die klasse class st{ //klasse für strings char* satz; int laenge; public: st(){ satz = NULL;
Konstruktor Frage
05/14/2015 - Web Development - 4 Replies
Hallo, Ich habe hier ein folgendes Programm (OOP) indem ein Konstruktor ist , nun ist meine Frage: Ich versteh nicht wie es den Namen des Fahrzeugs anzeigt(Ausgabe auf dem Bildschirm). Es wird durch den Code $this->bezeichnung angezeigt aber ich habe dieses neue Fahrzeug ja nicht als bezeichnung "makiert/angegeben" ich meine es so z.B $vespa = bezeichnung (z.B) Hier der Code:
C++ default Konstruktor - private Variablen setzen?
12/08/2014 - C/C++ - 1 Replies
#Edit, okay nach einigem rumprobieren, hab ichs jetzt doch hinbekommen :) Hat sich also erledigt.
[C++]Konstruktor Problem
07/29/2011 - C/C++ - 7 Replies
Hallo , ich habe ein Problem bzw eher gesagt eine Frage zu meinem Code. Ich habe mir eine schnuckelige Klasse angelegt die wie folgt aussieht: class Krieger { private:
Web.de kann nicht aufgerufen werden
01/07/2010 - Technical Support - 10 Replies
warum geht den ganzen tag web.de nicht? Server is down und wollt fragen ob jemand vllt infos hat, warum und wie lange das noch so ist.



All times are GMT +2. The time now is 00:43.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.