Strings und template meta programming mit boost::mpl

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Ingrater
Establishment
Beiträge: 103
Registriert: 18.04.2007, 21:52

Strings und template meta programming mit boost::mpl

Beitrag von Ingrater »

Hallo zusammen. In folgendem Quelltext gibt es eine funktion func2() die ich gerne äquivalent mit template meta programming ausdrücken würde. Meinen versuch dazu findet ihr in func1(). Leider produziert func1() aber wesentlich mehr assembler instruktionen als func2(). Außerdem ist es unglaublich umständlich strings in der boost::mpl zu deklarieren. Kennt ihr einen einfacherer / performatneren weg ein äquivalent von func2() zu erreichen?
Am liebsten wäre mir wenn aus einer liste wie in meinem beispiel die funktionscalls generiert werden und das am besten zur compile-zeit.

Ich habe auch schon versucht direkt pointer auf c-strings zu übergeben. Das geht nur leider nicht da die Adressen der String-Pointer zur compile-zeit noch nicht bekannt sind.

Code: Alles auswählen

#include <iostream>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/string.hpp>
#include <boost/mpl/for_each.hpp>

using namespace std;
using namespace boost;

typedef mpl::vector<mpl::string<'toll','er l','ang','er s','trin','g'>,
                    mpl::string<'noch',' bes','sere','r st','ring' >,
                    mpl::string<'ganz',' tol','ler ','stri','ng' >
                    > l;

struct work {
  template<typename T>
  inline void operator()(T) const
  {
    std::cout << mpl::c_str<T>::value << std::endl;
  }
};

inline void print(const char* pString){
  std::cout << pString << std::endl;
}

void func1(){
  mpl::for_each<l>(work());
}

void func2(){
  print("toller langer string");
  print("noch besserer string");
  print("ganz toller string");
}

int main()
{
  func1();
  func2();
  return 0;
}
Schonmal danke im vorraus.
MFG Ingrater
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: Strings und template meta programming mit boost::mpl

Beitrag von Aramis »

Du bist einfach an den Grenzen der C++-Templatemagie. String und Fließkommaverarbeitung geht nur mit Umwegen, wie hier durch Zusammenstückeln von 32-Bit Konstanten. Ich halte das für Unsinn ... Stringverarbeitung ist sowieso selten das Bottleneck, und wenn es doch mal notwendig sein sollte, geht Umschreiben in Assembler schneller als dieser Sprachmissbrauch ...

Hast du einen konkreten Grund, dass du dir das antust?
Benutzeravatar
Ingrater
Establishment
Beiträge: 103
Registriert: 18.04.2007, 21:52

Re: Strings und template meta programming mit boost::mpl

Beitrag von Ingrater »

Ich habe nur nach einem eleganten Weg gesucht bestimmte Bindungen die innerhalb meiner Engine und zwischen Engine und Skriptsprache erfolgen zu automatisieren und bin daher auf TMP gekommen. Ich werd das ganze dann aber wohl doch in ein normales array hauen und zur laufzeit durchiteriren, da es sowieso nur in der Initialisierung der Engine erfolgt dürfte es keinen großen Einfluss auf die gesamtperformance haben.
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Strings und template meta programming mit boost::mpl

Beitrag von kimmi »

Wenn ich dich richtig verstehe, möchtest du die Strings bereits zur Compilezeit zusammenbauen lassen. Welchen Performance-Vorteil erhoffst du dir dadurch? Die Bindings kannst du dir doch mit erheblich weniger Aufwand beim Initialisieren der Engine erzeugen lassen?
Und ist der längere Assemblercode schneller oder langsamer als der Standardweg?
Aramis hat geschrieben:... und wenn es doch mal notwendig sein sollte, geht Umschreiben in Assembler schneller als dieser Sprachmissbrauch ...
Vom Thema unabhängig: Bist du sicher, daß du Stringhandling in Assembler besser hinkriegst als der Compiler?

Gruß Kimmi
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: Strings und template meta programming mit boost::mpl

Beitrag von Aramis »

Nein. Ich wollte damit nur ausdrücken, dass ich exzessive Metaprogrammierung für noch unsinniger als das Umschreiben in Assembler halte. Unabhängig davon, dass ersteres eine Compiletime-Lösung ist.

Vielleicht ist in diesem speziellen Fall ein zusätzlicher Compile-Pass eine bessere Lösung: den Quellcode einlesen, die entsprechenden Informationen extrahieren (z.B. mit regulären Ausdrücken, um sich davor zu drücken die C++-Syntax einparsen zu müssen ...) und den Binding-Code automatisiert generieren lassen. Dann erst der reguläre C++-Compiler.
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Strings und template meta programming mit boost::mpl

Beitrag von kimmi »

Ich habe für automatisch generierte Bindings für Python da mal auf den Preprozessor zurückgegriffen und dann die Bindings beim Start der Applikation dem Interpreter bekannt gemacht. Das hatte keinen allzugroßen Performanceprobleme beinhaltet. Damit erspart man sich eigene Codegeneratoren und man kann allein auf die Bordmittel des Compilers setzen.

Gruß Kimmi
Benutzeravatar
Ingrater
Establishment
Beiträge: 103
Registriert: 18.04.2007, 21:52

Re: Strings und template meta programming mit boost::mpl

Beitrag von Ingrater »

Ich will im endeffekt keine Strings mit TMP zusammenbauen sondern die Binungen funktionieren einfach auf der Basis von Strings. Wenn ich es also mit TMP realisieren möchte brauche ich einen Weg mit TMP Strings dazustellen. Deswegen die Frage.
Helmut
Establishment
Beiträge: 237
Registriert: 11.07.2002, 15:49
Wohnort: Bonn
Kontaktdaten:

Re: Strings und template meta programming mit boost::mpl

Beitrag von Helmut »

Mal ne kurze off-topic-Frage: Seit wann ist sowas wie 'toll' legale C++-Syntax? Ich dachte in zwei ' darf nur ein Zeichen drin vorkommen?
Benutzeravatar
Ingrater
Establishment
Beiträge: 103
Registriert: 18.04.2007, 21:52

Re: Strings und template meta programming mit boost::mpl

Beitrag von Ingrater »

Es ist nicht wirklich legal. Der Compiler gibt dafür eine warnung aus. Da aber bei TMP immer 32-Bit werte gespeichert werden kann man in einem ' ' bis zu 4 zeichen speichern.
Benutzeravatar
Krishty
Establishment
Beiträge: 8267
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Strings und template meta programming mit boost::mpl

Beitrag von Krishty »

Ingrater hat geschrieben:Der Compiler gibt dafür eine warnung aus.
Welcher ist das? Visual C++ gibt nämlich keine aus (was, wie ich finde, eine Sauerei ist), selbst, wenn Language-Extensions deaktiviert sind, obwohl das eindeutig eine Microsoft-Extension ist …

Übrigens werden die Buchstaben bei 'toll' als "llot" gespeichert … ich habe mir deinen Code nicht genauer angeschaut, aber vielleicht kommen daher die zusätzlichen Befehle … (schwerer als optimierbar zu erkennen)?

Gruß, Ky
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Ingrater
Establishment
Beiträge: 103
Registriert: 18.04.2007, 21:52

Re: Strings und template meta programming mit boost::mpl

Beitrag von Ingrater »

Ich verwende den gcc 4.4 unter windows.
Eigentlich müsste es egal sein wie er den String speichert ist da das c_str<tmp_string> einen normalen mit \0 terminierten string zur comiple Zeit daraus machen sollte.
Antworten