Ich möchte in der Lage sein, einen benutzerdefinierten Zuordner mit Std :: Vector zu verwenden, so dass kleine Datenpuffer (sagen wir, weniger als 1024 Bytes) werden auf dem Stapel gespeichert, und nur längere Vektoren werden auf dem Heap gespeichert. Als jemand, der einen Hintergrund in Fortran hat, verursacht es mir jedes Mal körperliche Schmerzen, wenn ich eine Stapelspeicherzuweisung machen muss, um ein halbes Dutzend Elemente für die Dauer einer fünfzeiligen Subroutine zu speichern!Howard Hinnants short_alloc (C++ 11-Version) zum Kompilieren in Visual C++ 2015
Howard Hinnant hat seinen short_alloc Allokator veröffentlicht, der genau das tut, nach dem ich suche, und wenn ich es mit gcc kompiliere, funktioniert es ein Vergnügen. In Visual C++ kann ich es jedoch nicht kompilieren. In Visual C++ 2013 bestand der Teil des Problems darin, dass zu viele C++ 11 Schlüsselwörter nicht unterstützt wurden, aber ich stieß immer noch auf ein Problem, selbst wenn ich alle diese DEFINE's entfernt hatte. Heute habe ich versucht, in Visual C++ 2015 CTP 5 zu kompilieren, und die Schlüsselwörter werden jetzt alle unterstützt, aber die Kompilierung schlägt aus dem gleichen Grund fehl.
Das Problem ist folgendes: ein Grund, warum ich nicht ganz verstehen kann behaupten zu, die Copykonstruktor Code Standardeinstellungen des Hinnant aber löscht die Kopie Zuweisungsoperator:
short_alloc(const short_alloc&) = default;
short_alloc& operator=(const short_alloc&) = delete;
Wenn zu kompilieren versuchen, dies löst die folgende Fehler in Visual C++:
xmemory0(892): error C2280: 'short_alloc<int,1024> &short_alloc<1024>::operator =(const short_alloc<1024> &)': attempting to reference a deleted function
Was mich verwirrt noch mehr ist, dass wenn ich Hinnant den Code ändern sagen
short_alloc(const short_alloc&) = default;
short_alloc& operator=(const short_alloc&) = default;
... dann erhalte ich immer noch genau die gleiche Fehlermeldung.
Als Referenz hier ist mein Testcode:
#include <iostream>
#include <vector>
#include "short_alloc.h"
void populate_the_vector(std::vector<int, short_alloc<int, 1024> > &theVector)
{
arena<1024> B;
std::vector<int, short_alloc<int, 1024> > anothertestvec{(short_alloc<int, 1024>(B))};
anothertestvec.resize(10);
for (int i=0; i<10; ++i)
{
anothertestvec[i] = i;
}
theVector = std::move(anothertestvec); // Actually causes a copy, as the Arenas are different
}
int main()
{
arena<1024> A;
std::vector<int, short_alloc<int, 1024> > testvec{(short_alloc<int, 1024>(A))};
populate_the_vector(testvec);
printf("Testvec(10)=%d\r\n", testvec[5]);
return 0;
}
Der Kompilierungsfehler geht weg, wenn ich
theVector = std::move(anothertestvec);
so offensichtlich das zugrunde liegende Problem besteht darin, dass Visual C++ Ansätze sagen die Linie Kommentar-out die Kopie auf andere Weise als gcc. Trotzdem weiß ich nicht, wie ich von hier aus vorgehen soll. Gibt es eine Möglichkeit, das in Visual C++ zu funktionieren?
Das Zuweisungsoperator ist wahrscheinlich nicht verfügbar für die Basisklasse zur Verfügung steht edit: oder für ein Mitglied), und daher führt das Generieren der Standardimplementierung auch zu einem Löschen. – Mehrdad
@Mehrdad Es gibt keine Basisklasse, aber ein Referenzelement. –
@ T.C .: Oder, ja. Ich habe nicht wirklich darüber nachgedacht, welcher es sein könnte. – Mehrdad