/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
alignment i forbindelse med en stak
Fra : Thomas Krog


Dato : 16-03-04 00:43

Er det mon muligt at lave en stak der kan indeholde forskellige typer uden
at få problemer med alignment? Jeg vil gerne undgå at bruge new hver gang
jeg indsætter et objekt da det formodentlig vil øge kørselstiden en del.

Interfacet vil se sådan ud:
class MultiStack{
public:
MultiStack(size_t sz); // opret en stak der fylder sz bytes
template<class T>
T* push(); // opret element af typen T og returner en pointer til det
netop indsatte objekt
void pop(); // fjern det sidst indsatte objekt
};

Jeg tænkte at man måske kunne løse alignment problemet som vist nedenunder
(bemærk at eksemplet ikke indeholder pop og destructuren som jeg endnu ikke
har lavet). Princippet er at placere objekterne på adresser der går op i
sizeof(int). Siger C++ standarden mon noget om hvorvidt den slags er ok?

#include <memory>
class MultiStack{
public:
MultiStack(size_t sz) : b(reinterpret_cast<char*>(malloc(sz))), e(b) {}
template<class T>
T* push(){
T* res = reinterpret_cast<T*>(e);
new(e)T();
e += roundUp(sizeof(T));
return res;
}
static size_t roundUp(size_t x){
const y = sizeof(int);
return (1 + (x-1) / y) * y;
}
char* b; // begin
char* e; // end
};



 
 
Mogens Hansen (16-03-2004)
Kommentar
Fra : Mogens Hansen


Dato : 16-03-04 06:43

Thomas Krog wrote:
> Er det mon muligt at lave en stak der kan indeholde forskellige typer uden
> at få problemer med alignment?

Teoretisk: nej (sidst jeg checkede)
I praksis: ja

Se
* Boost.Variant (http://www.boost.org/doc/html/variant.html)
* Boost.Any (http://www.boost.org/doc/html/any.html)

Venlig hilsen

Mogens Hansen


Thomas Krog (16-03-2004)
Kommentar
Fra : Thomas Krog


Dato : 16-03-04 23:35


"Mogens Hansen" <mogens_h@dk-online.dk> wrote in message
news:c3644v$1dlr$1@news.cybercity.dk...
> Thomas Krog wrote:
> > Er det mon muligt at lave en stak der kan indeholde forskellige typer
uden
> > at få problemer med alignment?
>
> Teoretisk: nej (sidst jeg checkede)
> I praksis: ja
>
> Se
> * Boost.Variant (http://www.boost.org/doc/html/variant.html)
> * Boost.Any (http://www.boost.org/doc/html/any.html)

takker - det ser ud til at være et par nyttige værktøjer.



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408921
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste