Speicherverbrauch shared_ptr und normaler *


  • Mod

    booster schrieb:

    zum Thema c++ 17 und boost. Die compiler options habe ich gesetzt. (was macht das genau?) wird im code auch erkannt und bringt keinen Fehler mehr. Jedoch beim kompilieren. erhalte ich immer noch: auto_ptr': is not a member of 'std'

    Die Präprozessorsymbole müssen bereits existieren, bevor irgendwelche Standardheader eingebunden werden. Also am Besten am Anfang eines vorkompilierten Headers, wenn dein Projekt so etwas benutzt, oder gleich als Kommandozeilenparameter beim Compileraufruf.

    booster schrieb:

    AdsSymbolUploadInfo2

    Bei mir bereits in TcAdsDEF.h definiert.

    booster schrieb:

    und wieso liegt die class declaration "adsData" im Header nicht im namespace ads?

    Warum sollte sie?



  • ->
    also in die stdafx.h?
    oder bei Visual Studio bei den Eigenschaften Preprocessor Definitions.
    Da habe ich es auf jeden Fall hin gepackt.

    ->
    AdsSymbolUploadInfo2 in TcAdsDEF.h ? dann hast du das aber gemacht. Bei mir ist das nicht drin.

    ->
    ach stimmt dachte deine implementierungs sei im namespace ads nur der header nicht. Aber ist ja beides nicht im namespace ads.


  • Mod

    booster schrieb:

    AdsSymbolUploadInfo2 in TcAdsDEF.h ? dann hast du das aber gemacht. Bei mir ist das nicht drin.

    Dann ist deine TwinCAT Version vermutlich veraltet. In 2.11.2300 und 3.1.4022.16 ist es jedenfalls drin (Dateidatum 30.05.2016 10:25)



  • @camper

    Mir ist da nun noch was anderes aufgefallen. Wenn ich mit TwinCat2 teste oder auch mit einer TwincatVersion 3.1.4020.x steigt mein Speicher auch mit dem Code von Beckhoff selber auf maximal 400k

    Also irgendwas muss sich in der neusten TwinCatVersion geändert haben.

    Aktuell versuche ich aber noch deinen Code in meine Klassenstruktur zu bringen und meinen Code c++ 17 fähig zu machen. Da klemmts aber noch an ein paar stellen und stelle hier im Forum die ein oder andere Frage!



  • @camper.

    Nun bin ich endlich dazu gekommen dein Beispiel bei mir einzubinden und zu kompilieren.

    Nun habe ich folgendes festgestellt. Und zwar liefert mir adsData::operator[](std::string name) das objekt adsVarData.

    struct adsVarData
    {
        std::string                      name;
        std::string_view                 shortName;
        std::string_view                 typeName;
        std::string_view                 comment;
        decltype(AdsSymbolEntry::size)   size;
        decltype(AdsSymbolEntry::iGroup) group;
        decltype(AdsSymbolEntry::iOffs)  offset;
        adsDatatypeId                    type;
    };
    

    das stellt aber nur die Basisinformationen der Variablen bereit.

    Ich benötige hier aber natürlich auch die Informationen zu den SubSymbols.

    Mit den Informationen die ich hier erhalte füttere ich eine FactoryKlasse die in Abhängikeit von adsDatatypeId und typename objekte erzeugt.

    class VarFactory
    {
        shared_ptr<AdsVariable> CreateInstance(const string& name)
        {
            shared_ptr<AdsVariable> var;
            auto data = _adsData[name];
    
            switch (data.type)
            {
                case AdsDatatypeId::ADST_BIT:
                   var = make_shared<AdsBooleanVar>(data);
                   break;
    
                case AdsVariable::ADST_STRUCT:   // der einfach halber hier so -> struct selber nicht direkt über AdsDatatypeId identifizierbar
                    var = make_shared<AdsStructVar>(data);
                    break;
            }
        }
    
    }
    
    class AdsStructVar
    {
        explicit AdsStructVar(adsVarData)
        {
            CreateSubVars(adsVarData.SubVars());
        }
     }
    

    erzeuge ich hier nur eine "Boolean" Variable genügt es nur die Basisinformationen zu haben. (hier gibt es auch nicht mehr)

    erzeuge ich aber eine Structur Variable. muss ich hierzu auch alle Subvariablen erzeugen. Die Information hatte ich zuvor zur Verfügung in deiner adsVarData fehlt diese Information.


Anmelden zum Antworten