vlib
-
Ok, gecheckt
Solange die Page arbeitet, und nicht uneffizient ist, dann reicht's ja. Willst du die Geschichte eigentlich speziell für Small-Objects optimieren?ansonsten bin ich ein ganz großer freund davon, code wiederzeuverwenden (z.B. werden beide klassen Page benutzen).
Logo, wozu haben wird denn OOP :), mach das schließlich grad ähnlich, sobald meine liste fertig ist(verfluchter sort-algo
), werd ich ne queue und nen stack drumrumbauen.
-
GPC schrieb:
Ok, gecheckt
Solange die Page arbeitet, und nicht uneffizient ist, dann reicht's ja. Willst du die Geschichte eigentlich speziell für Small-Objects optimieren?es muß auch kleinere Pages geben. ich hab da zum beispiel einen algo, der um so schneller ist, je mehr stacks ich benutze. da sollte ich auch 256 bytes große pages unter den stack legen können. also kriegt Page wohl noch nen size_t als template-parameter. und die vielen stacks könnten ne gemeinsame freispeicherliste haben. vielleicht kriegt Stack noch eine allokator als parameter.
und unabhängig davon muß für allgemeine verwendung auch mal ein small-object-allocator gebaut werden.
irgendwann später mal... die range-checked iteratoren sind viel komplizierter geworden, als ich gedacht hab. hab zwischenzeitlich nicht durchgeblickt und den fehler gemacht, das komplizierte zeug nicht sofort zu löschen.
-
GPC schrieb:
verfluchter sort-algo
du baust nicht zufällig auch nen sort-algo für arrays?
-
version 0.011 (noch recht unsauber und zum teil sind die unten gesagten sachen doch noch noch nicht drin). http://volkard.de/vhlib.tar.bz2
für Array und Vector gilt:
wenn ANZAHL>0, dann
Array<int,ANZAHL,false> a;//ANZAHL ints auf dem stack (bzw im objekt)
Array<int,ANZAHL,true> a;//ANZAHL ints auf dem freispeicher
Array<int,ANZAHL> a;//ANZAHL ints auf dem freispeicher, falls
//ANZAHL*sizeof(int)>4096
wenn ANZAHL==0, dann
Array<int,0> a(10);//10 ints auf dem heap.
Array<int> a(10);//10 ints auf dem heap.
außerdem hat Array/Vector nur dann einen zuweisungsoperator, wenn die daten
auf dem freispeicher liegen. wegen exceptionsicherheit. nen copy-ctor gibts
immer.Queue wurde von MrN gebaut.
auch betriebssysteme ohne strerror_r wie FreeBSD compilieren jetzt.
linux wurde umgenannt nach default und statt #ifdef __linux__ steht jetzt
#else. falls mal linux und bsd gespalten werden müßten, kann man das besser
möglichst spät machen.klasse StringLiteral erstmal wieder fallengelassen. ist zu unpraktisch. kommt
wohl erst wieder, wenn unicode oder utf8 anstehen.osImpl.hpp benutzt kein using namespace os mehr. sie ist ja immerhin auch
nur ne hpp.swap ist nur noch für typen gültig, für die es explizit gesagt wurde.
alle iteratoren werden range-checked.
komplettes rewrite von Array.
assert.hpp
assert und ASSERT in ASSERT und STATIC_ASSERT geändert.
CHECK gebaut. ist wie assert, aber wird immer ausgewertet.
also bei CHECK(CloseHandle(file)!=INVALID_HANDLE_VALUE) wird auch
nach #define NDEBUG das CloseHandle(file) aufgerufen, aber dann wird
nicht getestet, ob es funktionierte.FileReader.hpp
FileReader gebaut.Vector.hpp
Vector gebaut. Vector ist da, damit man ihn als allocator benutzt und damit
objekte hineinerzeugt. der speicher ist in einem stück. er hat einen schnellen
Iterator. beim wachsen kopiert er um. vector ist kein array-ersatz, womit ich
mich von der üblichen stl-verwendung unterscheide. dafür gibt es hier Array.swap.hpp
funtion swap in ne eigene datei getan.FileWriter.hpp
FileWriter gebaut.
wenn nicht sicher ist, daß das schreiben klappt, und wenn so ein schreibfehler
gefangen werden soll, muß man per hand am ende flush() aufrufen, damit
keine exception im dtor fliegen kann.
-
Woher kommt eigentlich der vielsagende Name vhlib?
-
dali schrieb:
Woher kommt eigentlich der vielsagende Name vhlib?
Ist wahrscheinlich ein Kürzel für Volkard Henkel Library
Der Name entstand wahrscheinlich aus Mangel an weiterer Fantasie :p
-
Jeap wäre naheliegend
-
Caipi schrieb:
dali schrieb:
Woher kommt eigentlich der vielsagende Name vhlib?
Ist wahrscheinlich ein Kürzel für Volkard Henkel Library
Der Name entstand wahrscheinlich aus Mangel an weiterer Fantasie :pstimmt beides.
vielleicht sollte ich sie in "vlib" umnennen? klingt viel fantasievoller, gell?
so. http://volkard.de/vlib.tar.bz2 (iteratoren von vector und array endlich sind alle range-checked.)
-
volkard denkt ans heiraten.
-
volkard schrieb:
GPC schrieb:
verfluchter sort-algo
du baust nicht zufällig auch nen sort-algo für arrays?
Sorry dass ich das erst jetzt lese, hab das irgendwie übersehen.
Momentan bastel ich noch am QuickSort und Mergesort für meine LinkedList.
Ich hätte zwar durchaus Interesse einen für Arrays zu schreiben(bräuchte selber mal einen), allerdings müsste ich mir erstmal deine vhlib genau ansehen, wie sie aufgebaut ist, dein Design, entsprechende Konventionen usw. . Wenn ich dann meine, ich wäre gut genug um einen guten algo zu schreiben, hätte ich schon lust dazu.//EDIT: Dauert dir aber wohl zu lange, bis ich da fertig wär.
-
GPC schrieb:
allerdings müsste ich mir erstmal deine vhlib genau ansehen, wie sie aufgebaut ist, dein Design, entsprechende Konventionen usw.
template<typename Iterator> void sort(Iterator begin,Iterator end);
allerdings sofort probleme, denn die iteratoren können noch nicht zum beispiel op+(Iterartir,Size). das müßte dann nachgerüctet werden.
Dauert dir aber wohl zu lange, bis ich da fertig wär.
kann man nicht wissen. ich brauche noch keinen. wenn ich einen brauche, schreib ich halt einen. wenn du vorher einen hast, sag bescheid.
-
mkdir .outMakefile echo keep > .outMakefile/keep g++ -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/assert.o -MD assert.cpp g++ -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/credits.o -MD credits.cpp g++ -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/FileReader.o -MD FileReader.cpp g++ -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/FileWriter.o -MD FileWriter.cpp g++ -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/iostream.o -MD iostream.cpp g++ -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/main.o -MD main.cpp g++ -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/os.o -MD os.cpp g++ -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/prime.o -MD prime.cpp g++ -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/PrimeGenerator.o -MD PrimeGenerator.cpp In file included from Array.hpp:5, from PrimeGenerator.hpp:4, from PrimeGenerator.cpp:1: RawArray.hpp: In member function `RawObject& RawArrayMemory<RawObject, size, onHeap>::operator[](Size)': RawArray.hpp:19: Fehler: es gibt keine Argumente für »ASSERT«, die von einem Templateparameter abhängen, weshalb eine Deklaration von »ASSERT« verfügbar sein muss RawArray.hpp:19: Fehler: (mit »-fpermissive« wird G++ den Code akzeptieren, aber die Verwendung eines nicht deklarierten Namens ist veraltet) RawArray.hpp: In member function `RawObject& RawArrayMemory<RawObject, size, true>::operator[](Size)': RawArray.hpp:39: Fehler: es gibt keine Argumente für »ASSERT«, die von einem Templateparameter abhängen, weshalb eine Deklaration von »ASSERT« verfügbar sein muss RawArray.hpp: In member function `RawObject& RawArrayMemory<RawObject, 0ul, true>::operator[](Size)': RawArray.hpp:62: Fehler: es gibt keine Argumente für »ASSERT«, die von einem Templateparameter abhängen, weshalb eine Deklaration von »ASSERT« verfügbar sein muss RawArray.hpp: In member function `Data& RawArrayImpl<Data, size, onHeap>::operator[](Size)': RawArray.hpp:143: Fehler: es gibt keine Argumente für »ASSERT«, die von einem Templateparameter abhängen, weshalb eine Deklaration von »ASSERT« verfügbar sein muss RawArray.hpp: In member function `Data& RawArrayImpl<Data, size, onHeap>::operator[](Size) [with Data = Stack<PrimeGenerator::Runner>, long unsigned int size = 16384u, bool onHeap = false]': Array.hpp:18: instantiated from `Data& ArrayImpl<Data, size, onHeap>::operator[](Size) [with Data = Stack<PrimeGenerator::Runner>, long unsigned int size = 16384u, bool onHeap = false]' PrimeGenerator.hpp:71: instantiated from here RawArray.hpp:143: Fehler: »ASSERT« nicht deklariert (erste Verwendung dieser Funktion) RawArray.hpp:143: Fehler: (Jeder nicht deklarierte Bezeichner wird nur einmal für jede Funktion, in der er vorkommt, gemeldet.) swap.hpp: In function `void swap(Data&, Data&) [with Data = Size]': Stack.hpp:52: instantiated from `void swap(Stack<PrimeGenerator::Runner>&, Stack<PrimeGenerator::Runner>&)' PrimeGenerator.hpp:95: instantiated from here swap.hpp:6: Fehler: Abfrage des Elementes »swap« in »a«, das vom Nicht-Klassentyp »long unsigned int« ist RawArray.hpp: In member function `Data& RawArrayImpl<Data, size, onHeap>::operator[](Size) [with Data = PrimeGenerator::Runner, long unsigned int size = 255ul, bool onHeap = false]': Stack.hpp:36: instantiated from `Data& Stack<Data>::peek() const [with Data = PrimeGenerator::Runner]' PrimeGenerator.hpp:97: instantiated from here RawArray.hpp:143: Fehler: »ASSERT« nicht deklariert (erste Verwendung dieser Funktion) RawArray.hpp: In member function `Data& RawArrayImpl<Data, size, onHeap>::operator[](Size) [with Data = Stack<BigPrimeGenerator::Runner>, long unsigned int size = 1048576u, bool onHeap = false]': Array.hpp:18: instantiated from `Data& ArrayImpl<Data, size, onHeap>::operator[](Size) [with Data = Stack<BigPrimeGenerator::Runner>, long unsigned int size = 1048576u, bool onHeap = false]' PrimeGenerator.hpp:132: instantiated from here RawArray.hpp:143: Fehler: »ASSERT« nicht deklariert (erste Verwendung dieser Funktion) RawArray.hpp: In member function `Data& RawArrayImpl<Data, size, onHeap>::operator[](Size) [with Data = BigPrimeGenerator::Runner, long unsigned int size = 255ul, bool onHeap = false]': Stack.hpp:36: instantiated from `Data& Stack<Data>::peek() const [with Data = BigPrimeGenerator::Runner]' PrimeGenerator.hpp:158: instantiated from here RawArray.hpp:143: Fehler: »ASSERT« nicht deklariert (erste Verwendung dieser Funktion) RawArray.hpp: In member function `RawObject& RawArrayMemory<RawObject, size, onHeap>::operator[](Size) [with RawObject = AlignedMemory<16ul, 8ul>, long unsigned int size = 16384u, bool onHeap = false]': RawArray.hpp:144: instantiated from `Data& RawArrayImpl<Data, size, onHeap>::operator[](Size) [with Data = Stack<PrimeGenerator::Runner>, long unsigned int size = 16384u, bool onHeap = false]' Array.hpp:18: instantiated from `Data& ArrayImpl<Data, size, onHeap>::operator[](Size) [with Data = Stack<PrimeGenerator::Runner>, long unsigned int size = 16384u, bool onHeap = false]' PrimeGenerator.hpp:71: instantiated from here RawArray.hpp:19: Fehler: »ASSERT« nicht deklariert (erste Verwendung dieser Funktion) RawArray.hpp: In member function `Data& RawArrayImpl<Data, size, onHeap>::operator[](Size) [with Data = u32, long unsigned int size = 514ul, bool onHeap = false]': Array.hpp:18: instantiated from `Data& ArrayImpl<Data, size, onHeap>::operator[](Size) [with Data = u32, long unsigned int size = 514ul, bool onHeap = false]' BitField.hpp:24: instantiated from `void BitField<size>::set(Size) [with long unsigned int size = 16384u]' PrimeGenerator.hpp:86: instantiated from here RawArray.hpp:143: Fehler: »ASSERT« nicht deklariert (erste Verwendung dieser Funktion) RawArray.hpp: In member function `RawObject& RawArrayMemory<RawObject, size, onHeap>::operator[](Size) [with RawObject = AlignedMemory<16ul, 8ul>, long unsigned int size = 255ul, bool onHeap = false]': RawArray.hpp:144: instantiated from `Data& RawArrayImpl<Data, size, onHeap>::operator[](Size) [with Data = PrimeGenerator::Runner, long unsigned int size = 255ul, bool onHeap = false]' Stack.hpp:36: instantiated from `Data& Stack<Data>::peek() const [with Data = PrimeGenerator::Runner]' PrimeGenerator.hpp:97: instantiated from here RawArray.hpp:19: Fehler: »ASSERT« nicht deklariert (erste Verwendung dieser Funktion) RawArray.hpp: In member function `RawObject& RawArrayMemory<RawObject, size, onHeap>::operator[](Size) [with RawObject = AlignedMemory<16ul, 8ul>, long unsigned int size = 1048576u, bool onHeap = false]': RawArray.hpp:144: instantiated from `Data& RawArrayImpl<Data, size, onHeap>::operator[](Size) [with Data = Stack<BigPrimeGenerator::Runner>, long unsigned int size = 1048576u, bool onHeap = false]' Array.hpp:18: instantiated from `Data& ArrayImpl<Data, size, onHeap>::operator[](Size) [with Data = Stack<BigPrimeGenerator::Runner>, long unsigned int size = 1048576u, bool onHeap = false]' PrimeGenerator.hpp:132: instantiated from here RawArray.hpp:19: Fehler: »ASSERT« nicht deklariert (erste Verwendung dieser Funktion) RawArray.hpp: In member function `RawObject& RawArrayMemory<RawObject, size, onHeap>::operator[](Size) [with RawObject = AlignedMemory<4ul, 4ul>, long unsigned int size = 514ul, bool onHeap = false]': RawArray.hpp:144: instantiated from `Data& RawArrayImpl<Data, size, onHeap>::operator[](Size) [with Data = u32, long unsigned int size = 514ul, bool onHeap = false]' Array.hpp:18: instantiated from `Data& ArrayImpl<Data, size, onHeap>::operator[](Size) [with Data = u32, long unsigned int size = 514ul, bool onHeap = false]' BitField.hpp:24: instantiated from `void BitField<size>::set(Size) [with long unsigned int size = 16384u]' PrimeGenerator.hpp:86: instantiated from here RawArray.hpp:19: Fehler: »ASSERT« nicht deklariert (erste Verwendung dieser Funktion) make: *** [.outMakefile/PrimeGenerator.o] Fehler 1
(Ach wie hassen wir doch alle kryptische template-fehler)
-
füg doch mal include "assert.hpp" hinzu...
-
> tar xjf vlib.tar.bz2 > cd vlib > make mkdir .outMakefile echo keep > .outMakefile/keep g++ -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/assert.o -MD assert.cpp cc1plus: warnings being treated as errors Error.hpp:6: Warnung: ‘class Error’ has virtual functions but non-virtual destructor assert.cpp:4: Warnung: ‘class AssertError’ has virtual functions but non-virtual destructor make: *** [.outMakefile/assert.o] Fehler 1
template<typename RawObject,Size size,bool onHeap>
Warum benutzt du dieses bool-Flag? Finde ich
(a) nicht sonderderlich verständlich. Wenn jemand nun so etwas sieht und die vlib nicht kennt, dann weiß er nicht was es bedeutet
Array<int,10,true> a;
(b) was ist wenn man nun in Shared Memory oder in irgend einem spezial Speicher allokieren will, daher würde ich wie in der stdlib Allokatoren vorziehen.
-
DrGreenthumb schrieb:
füg doch mal include "assert.hpp" hinzu...
in RawArray.hpp?
ist drin. seit ner stunde afair.ach, wie ich das hasse, daß der eine compiler das durchläßt und der andere da nen fehler meldet.
-
volkard schrieb:
DrGreenthumb schrieb:
füg doch mal include "assert.hpp" hinzu...
in RawArray.hpp?
ist drin. seit ner stunde afair.ach, wie ich das hasse, daß der eine compiler das durchläßt und der andere da nen fehler meldet.
hehe, mach mal einen monotone oder svn server auf
btw. für welchen Compiler testest du? GCC 4?
-
kingruedi schrieb:
Error.hpp:6: Warnung: ‘class Error’ has virtual functions but non-virtual destructor
klarer programmierfehler. ist raus.
template<typename RawObject,Size size,bool onHeap>
Warum benutzt du dieses bool-Flag? Finde ich
(a) nicht sonderderlich verständlich. Wenn jemand nun so etwas sieht und die vlib nicht kennt, dann weiß er nicht was es bedeutetdie vlib soll nicht nur replacement der standardlib sein, sondern ein paar sachen schon anders machen. da flag wird schon ein wenig deutlicher bei
template<typename Data,Size size=0,bool onHeap=size==0> class Array...
ich will, daß ein Array mit echt vielen elementen ganz von allein auf dem heap liegt und ein kleies Array ganz von allein auf dem stack. das war bei std::vector immer ein großes argernis, daß der zwingend new benutzt und entsprechend langsam für kleine mengen ist.
Array<int,10,true> a;
normalerweise schreibt der benutzer ja
Array<int,10> a;
und benutzt das flag eher nie.
(b) was ist wenn man nun in Shared Memory oder in irgend einem spezial Speicher allokieren will, daher würde ich wie in der stdlib Allokatoren vorziehen.
ich habe noch nie std::vector zusammen mit einem eigenen allokator verwendet. hab die allokatoren erstmal vertagt. mus noch viel besser werden, um die gescheit hinzukriegen. aber bedarf ist schon da. der primzahlenzähler ist mit eigenem allokator 20% schneller.
-
kingruedi schrieb:
hehe, mach mal einen monotone oder svn server auf
theoretisch hab ich ja einen. muß mir mal erzählen lassen, wie man sowas verwendet.
btw. für welchen Compiler testest du? GCC 4?
windows: ms toolkit 2005
windows: mingw (gcc 3.4.2)
linux: gcc 3.3.5-20050130
-
Bei mir gehts immer noch nicht...
mkdir .outMakefile echo keep > .outMakefile/keep g++ -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/assert.o -MD assert.cpp g++ -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/credits.o -MD credits.cpp g++ -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/FileReader.o -MD FileReader.cpp g++ -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/FileWriter.o -MD FileWriter.cpp g++ -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/iostream.o -MD iostream.cpp g++ -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/main.o -MD main.cpp g++ -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/os.o -MD os.cpp g++ -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/prime.o -MD prime.cpp g++ -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/PrimeGenerator.o -MD PrimeGenerator.cpp swap.hpp: In function `void swap(Data&, Data&) [with Data = Size]': Stack.hpp:52: instantiated from `void swap(Stack<PrimeGenerator::Runner>&, Stack<PrimeGenerator::Runner>&)' PrimeGenerator.hpp:95: instantiated from here swap.hpp:6: Fehler: Abfrage des Elementes »swap« in »a«, das vom Nicht-Klassentyp »long unsigned int« ist make: *** [.outMakefile/PrimeGenerator.o] Fehler 1
Mit meinem i386-pc-linux-gnu-g++ gehts übrigens. Wird wohl was mit der größe von datentypen z tun haben...
-
ness schrieb:
Bei mir gehts immer noch nicht...
jup. momentchen.