(erledigt) [C++] expliziter Template-Parameter an new?
Verfasst: 15.07.2010, 15:47
Hi,
Titel ist Programm. Geht das? Wenn ja, wie?
Gruß, Ky
Titel ist Programm. Geht das? Wenn ja, wie?
Gruß, Ky
Die deutsche Spieleentwickler-Community (seit 1999).
https://zfx.info/
Code: Alles auswählen
float dumb;
int* pi = new(dumb) int(4);
Code: Alles auswählen
::new<4>(16);
Wieso sollte ich? Darf ich neuerdings einen einzelnen int nicht mehr auf dem Heap anlegen und auf 4 initialisieren wenn mir das Spaß macht? :DDanke! Du meinst [ ] statt ( ), oder?
Code: Alles auswählen
template <typename T>
void* operator new(size_t num, const T& other) {
...
}
std::string* p = new("hi!") std::string();
Ups. Ich habe so lange keine einzelnen Elemente mehr allokiert, dass ich scheinbar nicht mehr wusste, wie das aussieht … vielleicht habe ich auch gesehen, dass es Post #666 war und angenommen, dass der initialböse sei :D ’tschuldigung.Aramis hat geschrieben:Wieso sollte ich? Darf ich neuerdings einen einzelnen int nicht mehr auf dem Heap anlegen und auf 4 initialisieren wenn mir das Spaß macht? :D
Code: Alles auswählen
class CIntArray {
int * MyBegin;
size_t MyLength;
size_t MyCapacity;
void ReallocateTo(size_t NewCapacity) {
// Diese Funktion wird MÄCHTIG. ZU mächtig für Inlining. Sie muss alle Fälle behandeln; Allokation, Reallokation und Freigabe.
if(nullptr != MyBegin)
if(0 < NewCapacity)
// Reallokation
else
// Freigabe
else
if(0 < NewCapacity)
// Erst-Allokation
else
// Garnichts tun
MyCapacity = NewCapacity;
}
public:
// Leer erzeugen
CIntArray()
: MyBegin(nullptr)
, MyLength(0)
, MyCapacity(0)
{ }
// Kapazität reservieren um später Allokationen zu sparen
CIntArray(size_t ItsCapacity)
: MyBegin(nullptr)
, MyLength(0)
, MyCapacity(ItsCapacity)
{
ReallocateTo(ItsCapacity);
}
void push_back(int NewInt) {
if(MyCapacity < MySize + 1)
ReallocateTo(MyLength + 1);
MyBegin[MyLength++] = NewInt;
}
~CIntArray() {
ReallocateTo(0);
MyLength = 0;
}
};
…
// Erste Anwendung: Einmalig befüllen
CIntArray Array;
Array.push_back(1);
// Zweite Anwendung: In Schleife befüllen
CIntArray Indices(3 * NumberOfTriangles);
for(…) {
Indices.push_back(Triangle.Indices[0]);
Indices.push_back(Triangle.Indices[1]);
Indices.push_back(Triangle.Indices[2]);
}