WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Speicherverwaltung get/set

 

Nicolas
Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 12.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.07.2014, 03:38     Titel: Speicherverwaltung get/set
  Antworten mit Zitat      
Hallo allesamt!

Vorweg sei erwähnt, was ich eigentlich erreichen will:

Ich habe eine Klasse, die stark reduziert so aussieht:

Code:
classdef Repository < handle
    properties (Access = public)
        Data = struct;
        FieldData = cell(1, 0);
    end
    properties (SetAccess = protected, GetAccess = public)
        DimData
        SizeData
    end
end


Sie hat also Eigenschaften wie 'Data' und 'FieldData' mit vollem Zugriff für den Nutzer und einige, lediglich lesbare Eigenschaften -- alle hängen jedoch von einander ab:
Wenn z.B. ein Eintrag zu 'FieldData' hinzugefügt wird, so soll auch ein neues Feld in 'Data' mit jenem Namen entstehen -- und umgekehrt.

Um diese Abhängigkeiten stets zu erfüllen, habe ich bisher die set/get-Funktionen genutzt, bis mir aufgefallen ist, dass hierdurch bei jedem Schreibzugriff, wie z.B
Code:
MyRepository.Data.Test(1) = rand;
das gesamte Feld MyRepository.Data.Test zuvor (call-by-value) kopiert wird, was ich natürlich vermeiden will!


Hierzu meine Frage:
Gibt es eine Möglichkeit auf Property-Zugriffe zu reagieren, ohne ineffiziente Speicherzugriffe auszulösen?
Es reicht in meinem Fall aus, vor dem Lese- bzw. dem Schreibzugriff die Abhängigkeiten zu aktualisieren.

Auch die Verwendung der Attribute SetObservable und GetObservable scheint keine Lösung des Problems zu sein, da das Setzen dieser Attribute ebenfalls dazu führt, dass beim Schreibzugriff eine Kopie der Property erzeugt wird.

Ich hoffe auf eure Hinweise;
mit besten Grüßen

Nicolas


PS: Um das von mir beschriebene Problem des Mehraufwandes beim Schreibzugriff nachvollziehen zu können, sind diese Code-Beispiele vielleicht noch nützlich:

Gewünschte Geschwindigkeit:
Code:
% Erzeugen des Datenfeldes:
A = rand(1000, 1000, 100);
% Schreibzugriff:
A(1) = rand;
% ... schneller, speicherschonender Schreibzugriff


Unerwünschte Geschwindigkeit in meiner Klasse:
Hierfür zunächste die Klassendefinition:
Code:
classdef TestClass < handle
   properties (GetObservable = true)
      A = rand(1000, 1000, 100);
   end
end

... und der Beispielcode:
Code:
% Erzeugen einer Instanz von TestClass:
MyTestClass = TestClass;
% Schreibzugriff:
MyTestClass.A(1) = rand;
% ... langsamer, speicherineffizienter Schreibzugriff


Bei Weglassung des Attributs GetObservable gleicht der Schreibzugriff des zweiten Code-Beispiels von der Leistung dem des ersten Code-Beispiels.
Private Nachricht senden Benutzer-Profile anzeigen


Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.