2016-08-17 3 views
-4

Angenommen, ich habe eine C++ Klasse alsgemeinsamen Zeiger Schöpfung unter einem Konstruktor

class xyz 
{ 
... 
}; 
class abc 
{ 
    shared_ptr<xyz> ptr; 
    .. 
    abc():ptr(new xyz()) // line 1 
    { 
    } 
}; 

Was auf der Linie 1 aufgerufen wird?

make_shared<xyz>() 

oder

shared_ptr<xyz>(new xyz()) 

Hängt es von Compiler abhängen?

+2

Sie ihm gesagt 'neue xyz zu nennen()', 'nicht make_shared' zu nennen - es ist ziemlich seltsam wäre, wenn dein Compiler etwas anderes nennt als du gesagt hast, nicht wahr? – Anedar

Antwort

2

Die Sprache verwendet Bibliothekseinrichtungen nur sehr selten automatisch.

In einigen Fällen hängt die Kernsprache von der Standardbibliothek ab, ja. Z.B. Sie müssen den Header <typeinfo> einschließen, um den Operator typeid zu verwenden. Und da ist der Aufruf von std::terminate für eine nicht behandelte Ausnahme. Abgesehen von so speziellen und grundlegenden Fällen sind die Kernsprache und die Standardbibliothek jedoch voneinander getrennt. Mit Kenntnis der notwendigen Compiler- und OS-spezifischen Funktionen können Sie die Standardbibliothek selbst implementieren.

Also, kurz gesagt, gibt es keine Garantie Magie Ersatz Ihrer new -Ausdrucks mit einem Aufruf an make_shared, aber wenn der Compiler kann garantieren, dass der sichtbare Effekt wird die gleiche sein, es dann kann optimieren auf diese Weise unter die als-wenn Regel.

Soweit ich weiß, gibt es keine Compiler noch, dass das tut, als 2016. August

+0

'make_shared' kann größere Teile des virtuellen Speichers enthalten als' shared_ptr (new) ', wenn nur noch 'unique_ptr' übrig ist. Die Frage ist, ob das ein beobachtbarer Effekt ist. –

+0

@MooingDuck: Ja, aber ich denke, auf modernen Systemen, um einen Zustand zu bekommen, wo das eine Möglichkeit sein könnte, würde die Maschine auf Schneckentempo und darüber hinaus verlangsamen, so dass man Jahre darauf warten müsste. Zu den Problemen, die die Optimierung verhindern könnten, gehören (1) benutzerdefinierte Zuordner. Uhm, ich kann jetzt nicht an mehr denken. –

+0

overloaded 'operator new' wäre ein weiterer seltsamer Randfall. –

Verwandte Themen