Etwas anderes sind Kommentare und Namensgebung. Vermeide Funktionen wie "DoWork()". Niemand außer Du weiß was diese Funktion tut, außer dass sie anscheinend überhaupt etwas tun soll. Versuche auf alle Fälle den Informationsgehalt von Namen über 0 zu halten. Bei Kommentaren scheint manchmal X zu stehn und Y getan zu werden.
Akzeptiert. Werde ich verbessern.
Das größte: Du nutzt Rekursion, und zwar
einen Call pro Duplicate-Dateigröße. Kopier zweimal ein Maildir (so dass jede Datei zweimal existiert, also ein Duplikat ist) und Du wirst einen Stackoverflow kriegen - es sei denn dein Compiler macht dort TCO. Das klappt aber nicht Compilerübergreifend und erst recht nicht mit sicheren Optimierungsstufen.
Guter Punkt, werde ich ändern.
Das kleinere: Du liest alle Dateien mit Größe erstmal in den RAM und sortierst diese dann. Das sind O(n) Speicherauslastung und O(n*log n) Rechenzeit. Durch deine Verwendung einer Hash-Funktion bei Duplikaten kommst Du nochmal auf O(ds) wenn ds die Dateigröße aller Duplikate zusammen ist. Ein Delta wäre hier schneller, wenn nur zwei Kandidaten zu vergleichen sind.
Ok, nehme ich auf die Optimierungsliste auf.
Zur Korrektheit: Deine Verwendung von unique_ptr durch vielen Code hinweg scheint mir unsinnig. Da entstehen am Ende unzählige Aufrufe zu std::move, um das abzuangen. Bei manchen Calls bin ich mir sogar unsicher, ob die überhaupt funktionieren. Lass mal valgrind --tool=memcheck ./yourprog <threads> <path> drüber laufen und schau ob da was meckert.
Diese Funktion etwa tut nichts sinnvolles. Schau die mal shared_ptr und const myvar& an.
Sehe etwas differenzierter. Unique_ptr ist für unique Ownership. Die Daten werden durchgereicht und nicht an mehreren Stellen benötigt. Beispielsweise bei einer autom. Speicherfunktion wäre shared_ptr sinnvoll oder bei Nutzung von Threads.
Würde man std::move weglassen bekommt man ein Compiler Fehler. Da bei einem unique_ptr bekanntlich der Cpy-Ctor = delete ist.
Ich hatte es anfangs ohne unique_ptr und habe den vector direkt als rvalue übergeben. Ergebnis war, dass das Programm gecrasht ist. Mit Unique_ptr klappt es.
Warum? Habe es nicht weiter verfolgt.
Hier die Valgrind output:
==1508== Memcheck, a memory error detector
==1508== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==1508== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==1508== Command: ./bdups 33 /mnt/hdd/TestFolder/
==1508==
==1508==
==1508== HEAP SUMMARY:
==1508== in use at exit: 72,704 bytes in 1 blocks
==1508== total heap usage: 5,273,546 allocs, 5,273,545 frees, 2,266,388,354 bytes allocated
==1508==
==1508== LEAK SUMMARY:
==1508== definitely lost: 0 bytes in 0 blocks
==1508== indirectly lost: 0 bytes in 0 blocks
==1508== possibly lost: 0 bytes in 0 blocks
==1508== still reachable: 72,704 bytes in 1 blocks
==1508== suppressed: 0 bytes in 0 blocks
==1508== Rerun with --leak-check=full to see details of leaked memory
==1508==
==1508== For counts of detected and suppressed errors, rerun with: -v
==1508== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)