Angesichts des neuen Toolset, das von vielen Programmierern in C ++ bereitgestellt wird, zielen viele auf Programmvereinfachung, Ausdruckskraft und Effizienz ab, überfliegen ihren alten Code und nehmen Optimierungen (einige sinnlos, andere erfolgreich) vor, um ihre Ziele zu erreichen. Was sind die besten Praktiken, wenn Sie versuchen, nicht zu viel Zeit für solche Arbeiten zu verlieren und nur nicht aufdringliche und in sich geschlossene Änderungen vorzunehmen?
Lassen Sie mich das Offensichtliche streichen:
Verwenden Sie auto , um iteratorbasierte Schleifen auszuführen:
for (std::vector<foo>::const_iterator it(lala.begin()), ite(lala.end()); it != ite; ++it); // becomes for (auto it(lala.cbegin()), ite(lala.cend()); it != ite; ++it);
Verwenden Sie tie für mehrere Zuweisungen, die nur Codezeilen im C-Stil erzeugen ( wie können Sie einer Struktur mehrere Werte gleichzeitig zuweisen? )
a = 1; b = 2; c = 3; d = 4; e = 5; // becomes std::tie(a, b, c, d, e) = std::make_tuple(1, 2, 3, 4, 5);
Um eine Klasse nicht vererbbar zu machen, deklarieren Sie sie einfach als "final" und löschen Sie den Code, der ein solches Verhalten erreicht hat: http://www.parashift.com/c++-faq/final-classes.html
Verwenden Sie das Schlüsselwort delete, um Konstruktoren / Destruktoren explizit auszublenden, anstatt sie als privat zu deklarieren (z. B. Code zum Erstellen von Heap-basierten Objekten, nicht kopierbaren Objekten usw.).
Verwandeln Sie triviale Funktoren, die nur erstellt wurden, um die Ausführung eines einzelnen STL-Algorithmus zu vereinfachen, in Lambda- Funktionen (abgesehen von der Reduzierung der Code-Unordnung haben Sie garantiert Inline-Aufrufe).
Vereinfachen Sie das RAII-Wrapping eines Objekts mit einem intelligenten Zeiger
Befreien Sie sich von bind1st, bind2nd und verwenden Sie einfach bind
Ersetzen Sie handgeschriebenen Code für Typmerkmale (Is_ptr_but_dont_call_for_const_ptrs <> und dergleichen :)) durch Standardcode, der von <type_traits> bereitgestellt wird
Hören Sie auf, Boost-Header für die jetzt in STL implementierte Funktionalität einzuschließen (BOOST_STATIC_ASSERT vs static_assert).
Stellen Sie Verschiebungssemantik für Klassen bereit (obwohl dies nicht als schmutzige / schnelle / einfache Änderung qualifiziert wäre)
Verwenden Sie nach Möglichkeit nullptr anstelle des NULL-Makros und entfernen Sie den Code, der Container mit Zeigern mit Nullen füllte, die in den Objekttyp umgewandelt wurden
std::vector<foo*> f(23); for (std::size_t i(0); i < 23; ++i) { f[i] = static_cast<foo*>(0); } // becomes std::vector<foo*> f(23, nullptr);
Löschen Sie die Syntax für den Zugriff auf Vektordaten
std::vector<int> vec; &vec[0]; // access data as a C-style array vec.data(); // new way of saying the above
Ersetzen Sie throw () durch noexcept (abgesehen von der Vermeidung der veralteten Ausnahmespezifikation erhalten Sie einige Geschwindigkeitsvorteile http://channel9.msdn.com/Events/GoingNative/2013/An-Effective-Cpp11-14-Sampler @ 00.29.42)
void some_func() noexcept; // more optimization options void some_func() throw(); // fewer optimization options void some_func() ; // fewer optimization options
Ersetzen Sie Code, bei dem Sie ein Tempory in einen Container verschieben würden, und hoffen Sie, dass der Optimierer die Kopie mit einer "Emplace" -Funktion entfernt, sofern verfügbar, um das Argument perfekt weiterzuleiten und ein Objekt direkt in einen Container ohne temporäres at zu konstruieren alle.
vecOfPoints.push_back(Point(x,y,z)); // so '03 vecOfPoints.emplace_back(x, y, z); // no copy or move operations performed
AKTUALISIEREN
Die Antwort von Shafik Yaghmour wurde zu Recht mit dem Kopfgeld für die größte Akzeptanz beim Publikum ausgezeichnet.
Die Antwort von R Sahu war meine akzeptierte, weil die Kombination der vorgeschlagenen Funktionen den Geist des Refactorings einfängt : Code klarer und sauberer und einfacher und eleganter machen.