JPH06324859A - データオブジェクト処理方法 - Google Patents

データオブジェクト処理方法

Info

Publication number
JPH06324859A
JPH06324859A JP6082726A JP8272694A JPH06324859A JP H06324859 A JPH06324859 A JP H06324859A JP 6082726 A JP6082726 A JP 6082726A JP 8272694 A JP8272694 A JP 8272694A JP H06324859 A JPH06324859 A JP H06324859A
Authority
JP
Japan
Prior art keywords
pointer
data
class
creation process
programming language
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP6082726A
Other languages
English (en)
Inventor
Alexandros Biliris
ビリリス アレキサンドロス
Shaul Dar
ダー シャウル
Narain H Gehani
エイチ.ゲハニ ナレイン
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
AT&T Corp
Original Assignee
American Telephone and Telegraph Co Inc
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by American Telephone and Telegraph Co Inc filed Critical American Telephone and Telegraph Co Inc
Publication of JPH06324859A publication Critical patent/JPH06324859A/ja
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4488Object-oriented
    • G06F9/4493Object persistence

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)
  • Stored Programmes (AREA)

Abstract

(57)【要約】 【目的】 C++のようなオブジェクト指向言語の意味
規則の変更を必要とせずに、隠蔽ポインタを含むデータ
オブジェクトを持続的にすることを可能にする。 【構成】 データオブジェクト内の不正なポインタは、
メモリ内の正しい位置を参照するように変更される。デ
ータオブジェクトを作成するのに使用した既存のプロセ
スの修正バージョンが生成される。この修正されたプロ
セスは、そのデータオブジェクトに対するメモリ空間の
割当、および、そのデータオブジェクト内のデータの初
期化の両方を禁止する。次に、そのデータオブジェクト
が、例えば後のプログラム呼び出しによって、後で読み
込まれると、オブジェクト作成プロセスのこの修正バー
ジョンがそのデータオブジェクトに適用される。その結
果、新たにメモリを割り当てたり、そのデータオブジェ
クト内のデータメンバを分配したりすることなく、隠蔽
ポインタは適切に初期化される。

Description

【発明の詳細な説明】
【0001】
【産業上の利用分野】本発明は、一般的に、コンピュー
タプログラミング言語の分野に関し、特に、C++のよ
うなオブジェクト指向プログラミング言語に関する。
【0002】
【従来の技術】オブジェクト指向プログラミング言語
は、1980年代半ばにプログラミング言語C++が導
入されて以来、ますます広まっている。C++は、科学
および工学の多くの領域で選択されるプログラミング言
語となっており、また、計算機科学の分野でも広く知ら
れ使用されている。C++の構文規則および意味規則
は、多くの参考書およびリファレンスマニュアルに詳細
に記載されている。
【0003】オブジェクト指向プログラミングで使用さ
れているように、データ「オブジェクト」とは、指定さ
れた型のデータの特定の項目である。例えば、あるプロ
グラム変数は、整数型のデータであるオブジェクトを含
むことが可能である。ほとんどのプログラミング言語
は、整数型、実数型、文字型、配列型、ポインタ型のよ
うな、あらかじめ定義されたデータ型のセットを備えて
いる。ところが、オブジェクト指向プログラミング言語
では、ユーザ(すなわち、プログラマ)が新たな追加の
データ型を定義することが可能である。
【0004】C++では、ユーザ定義データ型は「クラ
ス」として知られている。クラスとは、命名されたデー
タ要素(データメンバ)のセットと、そのデータを操作
するように設計された操作のセット(メンバ関数)のこ
とである。「クラスオブジェクト」とは、特定のクラス
のデータの特定の項目のことである。
【0005】オブジェクト指向プログラミングは、抽象
データ型の概念を拡張して、型(タイプ)と「サブタイ
プ」との間に関係が確立されることが可能となってい
る。これは、「継承」と呼ばれる、オブジェクト指向プ
ログラミングの基本的な特徴である機構によって実現さ
れる。共通の特徴を再実現するのではなく、クラスは、
他のクラスのデータメンバおよびメンバ関数を継承する
ことができる。例えば、C++では、継承は「クラス派
生」という機構によって実現される。「派生クラス」と
して知られるクラスは、「基本クラス」として知られる
他のクラスからデータおよび関数を継承することができ
る。このようにして、派生クラスのオブジェクトは基本
クラスの特徴を有し、従って、派生クラスは基本クラス
の「サブタイプ」とみなすことができる。
【0006】C++における「仮想関数」は、基本クラ
ス参照(ポインタ)によって呼び出され、実行時(ラン
タイム)に動的に結合される特別のメンバ関数である。
C++では、基本クラスのポインタが、自己のクラスの
オブジェクトのみならず、派生クラスオブジェクトをも
参照することが可能である。「仮想」として指定された
関数がこのようなポインタを使用して呼び出される場
合、呼ばれる特定の関数は参照されたオブジェクトの実
際のクラス型に依存する。呼び出される命名された関数
の特定のバージョンは、その関数に渡される引数の実際
のデータ型(すなわち、クラス)に適当であるようにユ
ーザによって定義されたものである。その適当な関数を
呼び出すコードを生成するのは一般にC++コンパイラ
の仕事である。適当な特定の仮想関数の選択は、ユーザ
に透過的であることが望ましい。
【0007】C++における「仮想基本クラス」は、デ
フォルトの継承機構のオーバーライドを可能にする。こ
れによって、ユーザは、基本クラスが派生階層内で複数
回現れるような場合に、その基本クラスが共用されるよ
うに指定することが可能となる。特に、クラスは、他の
複数のクラスから派生可能であり、さらに、それらのク
ラスのうちの複数個が、共通の基本クラスから派生可能
である。デフォルトの継承機構はツリー派生階層構造を
使用しているため、このような派生クラスは、共通の基
本クラスが複数回現れる場合、そのそれぞれに対して基
本クラスデータの別々のインスタンスを生成することに
なる。同一の情報を表す同一のデータ項目を一般に目的
とするこのような複数のインスタンスは、好ましくない
曖昧さを生じることがある。仮想基本クラスの使用はこ
の曖昧さを回避する。
【0008】C++において、仮想関数または仮想基本
クラスを含むデータオブジェクトの内部システム表現
は、これらのファシリティを実現するために使用される
「隠蔽」メモリポインタを含む。仮想関数の場合、隠蔽
ポインタは、どの関数を呼ぶかを決定するために使用さ
れる仮想関数テーブルを指す。仮想基本クラスの場合、
隠蔽ポインタは、共通の基本クラスの共用実現値を指す
ために使用される。これらのポインタはC++コンパイ
ラによって生成される。これらは、ユーザによって指定
されていないという意味で「隠蔽」ポインタである。従
って、ユーザは一般に、C++において、それらの値を
直接操作する機構を有しない。これらのポインタはユー
ザが作成したデータオブジェクトの一部であるにもかか
わらず、これらのポインタの内容をユーザが変更するこ
とはできない。さらに、これらのポインタがメモリ内で
指す位置は実行プログラムの現在の呼び出し中にしか意
味がないため、これらのポインタは「揮発性」である。
換言すれば、これらのポインタは、それらを作成したプ
ログラム呼び出しの時間中のみ有効である。
【0009】後で読み込むためにデータをディスクのよ
うな大容量記憶装置に書き込むことが有利な場合が多
い。多くの場合、そのデータを読み込むのは異なるプロ
グラムかまたは同じプログラムの後での呼び出しかであ
る。例えば、データベース管理プログラムは、そのプロ
グラムの後での呼び出しによって取得し操作するデータ
オブジェクトの集合を含むファイルをディスク上に維持
することが多い。このように、このようなアプリケーシ
ョンが適切に機能するためには、ディスク上に記憶され
たデータが複数のプログラム呼び出しにわたって有効で
あることが必要である。複数のプログラム呼び出しにわ
たって有効であるデータを(それを作成した実行プログ
ラムの現在の呼び出しにその有効性が制限される揮発性
データに対して)「持続性」データという。
【0010】ディスク上に記憶されたデータオブジェク
トが隠蔽ポインタを含む場合、異なるプログラムによっ
て、または、同じプログラムの後の呼び出しによってメ
モリに読み込んでも、それらは直接使用可能ではない。
これらのデータオブジェクトは揮発性となる。隠蔽ポイ
ンタは、後の呼び出しにおいて不正確なアドレスデータ
を含むのみならず、その使用は不正なメモリ参照となる
可能性が高い。さらに、ユーザは、これらのポインタが
後のプログラム呼び出しのメモリ空間における適切な情
報(例えば、仮想関数テーブルまたは共用基本クラスデ
ータ)を指すように、これらのポインタを有効にするよ
う修正する直接の機構を有しない。
【0011】
【発明が解決しようとする課題】このようなことは、C
++言語の意味規則を変更することによって対処しう
る。あるいは、この問題を軽減するために言語コンパイ
ラを修正することも可能である。しかし、そのような解
決法では、インストールされたC++コンパイラやC+
+プログラムの非常に大きな基礎を変更しなければなら
ない。このような変更は既存のC++プログラムに悪影
響を与える可能性があり、この点に関して異なるコンパ
イラを使用してコンパイルされたオブジェクトプログラ
ム間の互換性を損なう恐れがある。さらに、このような
解決法では、修正したコンパイラの多くのコピーを再配
布する必要がある。従って、C++のようなオブジェク
ト指向言語の意味規則の変更を必要とせずに、隠蔽ポイ
ンタを含むデータオブジェクトを持続的にすることが可
能な機構を提供することが望まれる。
【0012】
【課題を解決するための手段】本発明は、ポインタを有
するデータオブジェクトを持続的にすることが可能な方
法を提供する。データオブジェクト内の不正なポインタ
は、メモリ内の正しい位置を参照するように変更され
る。実施例によれば、データオブジェクトを作成するの
に使用した既存のプロセスの修正バージョンが生成され
る。この修正されたプロセスは、そのデータオブジェク
トに対するメモリ空間の割当、および、そのデータオブ
ジェクト内のデータの初期化の両方を禁止する。次に、
そのデータオブジェクトが、例えば後のプログラム呼び
出しによって、後で読み込まれると、オブジェクト作成
プロセスのこの修正バージョンがそのデータオブジェク
トに適用される。その結果、新たにメモリを割り当てた
り、そのデータオブジェクト内のデータメンバを分配し
たりすることなく、隠蔽ポインタは適切に初期化され
る。
【0013】この実施例によれば、使用されるプログラ
ミング言語はC++であり、オブジェクト作成プロセス
はnew演算子であり、オブジェクト作成プロセスの修
正バージョンは、newの新たなバージョンを定義する
ようにnew演算子を多重定義することによって生成さ
れる。
【0014】さらに、この実施例によれば、オブジェク
ト作成プロセスは、そのオブジェクト内のデータメンバ
を初期化するためのユーザ定義関数の実行を含むことが
可能である。ユーザ定義初期化関数は、オブジェクト作
成プロセスの修正バージョンによって呼び出される際に
データの初期化を禁止するように修正される。これは、
オブジェクト作成プロセスにおけるグローバルフラグ変
数をセットすることによって実現可能である。次にこの
変数は初期化関数によってテストされる。このフラグが
セットされている場合、データメンバの初期化は回避さ
れる。
【0015】
【実施例】
[はじめに]図1に、プログラミング言語C++の派生
クラス機能を説明するユーザ定義データ型階層を示す。
クラスperson12は、クラスstudent14
およびクラスemployee16の両方の基本クラス
であり、それぞれ、クラスperson12からの派生
クラスである。クラスstudent14およびクラス
employee16は(クラスperson12とと
もに)クラスstudent_employee18の
基本クラスである。これらの型は、例えば、クラスとし
て知られるC++の型定義ファシリティによって定義さ
れる。
【0016】クラス宣言は、仕様と本体という2つの部
分から構成される。クラス仕様は、クラスのデータメン
バ(属性ともいう)とメンバ関数(メソッドともいう)
の宣言を含む。クラス本体は、クラス仕様で宣言された
がその本体は与えられなかった、関数の本体(例えば実
行可能コード)から構成される。
【0017】[C++における仮想関数の使用]上記の
ように、C++における仮想関数は関数呼び出しによっ
て呼び出される特定の関数が、その関数に渡されるデー
タの実際の型に基づいて実行時に決定されることを可能
にする機構である。C++では基本クラスポインタ(参
照)が派生クラスオブジェクトを参照することが可能で
あるため、この仮想関数の機能は特に有用である。例え
ば、図1の階層において、personポインタはst
udentオブジェクトを参照することができる。与え
られた名前の仮想関数がこのポインタを使用して呼び出
される場合、呼ばれるその関数の特定のバージョンは、
参照されるオブジェクトのデータ型に依存する。もちろ
ん、適当な関数を呼び出すコードを生成するのはC++
コンパイラの仕事である。
【0018】以下のC++コードは、図1のクラス階層
のC++定義の例である。 class person { public: char firstname[MAX]; char lastname[MAX]; int age; virtual void print(); }; class student: virtual public person { public: char university[MAX]; virtual void print(); }; class employee: virtual public person { public: char company[MAX]; int salary; virtual void print(); }; class student_employee: public employee, public student { public: int maxhours; virtual void print(); };
【0019】上記のコードで、4つのクラスのそれぞれ
の仕様はデータメンバを定義している。各仕様は、pr
intという名前の仮想関数の宣言も含む。特に、クラ
スpersonは、3つのクラスメンバ(firstn
ame(姓)、lastname(名)、およびage
(年齢))と、printという名前の仮想関数のまだ
指定されていないバージョンとを含むと宣言されてい
る。クラスstudentは、基本クラスperson
に含まれるものの他に1つのデータメンバ(unive
rsity(大学名))を含み、さらに、printと
いう名前の仮想関数のまだ指定されていないバージョン
とを含むと宣言されている。クラスemployee
は、基本クラスpersonに含まれるものの他に2つ
のデータメンバ(company(会社名)およびsa
lary(給料))を含み、さらに、printという
名前の仮想関数のまだ指定されていないバージョンとを
含むと宣言されている。クラスstudent_emp
loyeeは、その基本クラスであるクラスemplo
yeeおよびクラスstudentに含まれるものの他
に1つのデータメンバ(maxhours(最大勤務時
間))を含み、さらに、printという名前の仮想関
数のまだ指定されていないバージョンとを含むと宣言さ
れている。
【0020】上記のコードで、各基本クラスは仮想基本
クラスであると宣言されている。上記のように、この宣
言は、基本クラスのデータメンバのコピーは、どの派生
クラスの各インスタンスにも1度しか現れないことを保
証する。仮想基本クラスは、与えられたクラスを仮想基
本クラスとして指定する継承階層のすべての要素によっ
て共用される。基本クラスを仮想と宣言することは、単
一の継承(上記の例ではクラスemployeeおよび
クラスstudent)には影響がないが、多重継承
(上記の例ではクラスstudent_employe
e)の場合には差異が生じる。
【0021】以下のC++コードは、上記のコードで定
義された4つのクラスのそれぞれに対する、仮想関数p
rintの定義の例である。 void person::print() { cout << firstname << " " << lastname << ", age = " << age << endl; } void student::print() { person::print(); cout << "student at " << university << endl; } void employee::print() { person::print(); cout << "employed at " << company << endl; ] void student_employee::print() { person::print(); cout << "student at " << university << endl; cout << "employed at " << company << endl; }
【0022】上記のコードで、引数として渡されたデー
タオブジェクトに関する情報を適当に印字する仮想関数
printのバージョンが各クラスに対して定義されて
いる。この関連情報には、クラスpersonでは名前
および年齢が含まれ、クラスstudentでは名前、
年齢および大学が含まれ、クラスemployeeでは
名前、年齢および会社が含まれ、クラスstudent
_employeeでは名前、年齢、大学および会社が
含まれる。型personのオブジェクトへのポインタ
であると宣言されたポインタ(参照)によってprin
tが呼び出されると、実際に呼び出される仮想関数はこ
の参照されたオブジェクトの実際の型に従って実行時に
決定されることになる。例えば、print仮想関数の
使用を例示する以下のプログラムコードを考える。
【0023】上記のプログラムで、ppはperson
オブジェクトを指しているため、最初のpp−>pri
nt関数呼び出しはクラスpersonに対して定義さ
れたprint関数を呼び出す。その結果、クラスpe
rsonに対して定義された仮想関数printのバー
ジョンによって名前および年齢の情報が印字される。同
様に、ps−>print関数はクラスstudent
のprint関数を呼び出す。しかし、2番目のpp−
>print関数呼び出しでは、前の行のコードでpp
にstudentオブジェクトへのポインタが代入され
ているため、ppの宣言されたデータ型がperson
へのポインタであるにもかかわらず、クラスstude
ntのprint関数が呼び出される。
【0024】[C++における仮想基本クラスの使用]
上記のように、仮想基本クラスの目的は、多重継承の場
合に基本クラスデータメンバの共用を可能にすることで
ある。上記の例では、クラスpersonはstude
ntクラスおよびemployeeクラスの両方の仮想
基本クラスであり、クラスstudent_emplo
yeeはstudentクラスおよびemployee
クラスの両方から派生されている。派生クラスオブジェ
クトの各基本クラスに対して、派生クラスオブジェクト
の表現の一部は、その基本クラスに関連するデータの表
現とする必要がある。例えば、studentオブジェ
クトはperson「サブオブジェクト」を含む。em
ployeeオブジェクトも同様である。さらに、st
udent_employeeオブジェクトはstud
entサブオブジェクトおよびemployeeサブオ
ブジェクトの両方を含む。しかし、クラスperson
はクラスstudentおよびクラスemployee
の両方の仮想基本クラスである。従って、studen
t_employeeオブジェクトは、クラスpers
onのインスタンスを2つではなく1つだけ含むべきで
ある。employeeサブオブジェクトおよびstu
dentサブオブジェクトはこのpersonのインス
タンスを共用することになる。
【0025】以下のC++プログラムコードを考える。
【0026】se−>studentおよびse−>e
mployeeは(person基本クラスはそれぞれ
の仮想基本クラスであると宣言されているため)同じp
ersonサブオブジェクトを共用しているため、se
−>student::ageおよびse−>empl
oyee::ageはいずれも同一のデータ要素、すな
わち、se−>person::ageを参照する。従
って、C++実現は、これらのデータ項目が実際に1つ
の同じものであることを保証しなければならない。
【0027】[仮想関数および仮想基本クラスのC++
実現]図2〜図5に、代表的なC++実現において上で
定義した4つのクラスのそれぞれの型のオブジェクトの
メモリ表現を示す。図2は、personオブジェクト
のメモリ配置である。図3は、studentオブジェ
クトのメモリ配置である。図4は、employeeオ
ブジェクトのメモリ配置である。図5は、studen
t_employeeオブジェクトのメモリ配置であ
る。
【0028】これらの図からわかるように、仮想関数を
有するクラスの各オブジェクトは、vtblと呼ぶ仮想
関数テーブルを指す隠蔽ポインタを含む。vtblは、
与えられたオブジェクトに対して呼び出される特定の仮
想関数のアドレスを含む。派生クラスオブジェクトの場
合、基本クラスサブオブジェクトのvtblは、基本ク
ラスサブオブジェクトのアドレスが与えられた場合に、
派生クラスオブジェクトのアドレスを発見するために使
用されるオフセット(delta)も含む。
【0029】図2において、vtblポインタ22は、
personオブジェクト21のメモリ配置の第1エン
トリである。もちろん、このメモリ配置には、このクラ
スのデータメンバのエントリであるfirstname
23、lastname24およびage25が含まれ
る。vtblポインタ22はperson vtbl2
6を指す。person vtbl26は、与えられた
関数名(すなわちprint)がこのオブジェクトに送
られた場合(すなわち、&person::prin
t)に呼び出される仮想関数の特定のバージョンのアド
レスを含む。
【0030】図3に、studentオブジェクト31
のメモリ配置を示す。この配置の第1の部分は、クラス
studentに特有のデータからなる。これは、st
udent vtbl35を指すvtblポインタ32
から始まる。次に、この配置はvbaseポインタ33
を含む。personはstudentの仮想基本クラ
スとして宣言されているため、studentオブジェ
クトのperson要素への参照はポインタを通しての
間接参照によって解決される。このポインタをvbas
eポインタという。注意すべきことであるが、図3のv
baseポインタ33は、studentオブジェクト
31の配置の第2の部分、すなわち、personサブ
オブジェクト36を指している。特に、personサ
ブオブジェクト36は、person vtbl28を
指すvtblポインタ22と、personサブクラス
のデータメンバのエントリ、すなわち、firstna
me23、lastname24およびage25とか
らなる。vbaseポインタ33の後、personサ
ブオブジェクトの前には、studentオブジェクト
31のメモリ配置は、クラスstudentのただ1つ
の特有のデータメンバであるuniversity34
がある。
【0031】student vtbl35は、stu
dentオブジェクト31とともにその引数として呼び
出されたときに呼ばれるprint関数の適当なバージ
ョンのアドレス、すなわち、&student::pr
intを含む。さらに、person vtbl28
は、アドレス&student::printを含むの
みならず、サブオブジェクト(personサブオブジ
ェクト36)のアドレスが与えられた場合に派生クラス
オブジェクト(studentオブジェクト31)のア
ドレスを発見するために使用されるオフセットをも含
む。特に、基本サブクラスの各vtblは、派生オブジ
ェクトのメモリ配置におけるサブオブジェクトの相対位
置を表すオフセットを含む。例えば、person v
tbl28は、値delta(student,per
son)を含む。これは、studentオブジェクト
31におけるvtblポインタ22とvtblポインタ
32のアドレスの差に等しい。
【0032】基本クラス型のオブジェクトへのポインタ
であると宣言されたポインタが派生クラス型のオブジェ
クトを指すように代入された場合、このポインタは派生
クラスオブジェクト内の基本クラスサブオブジェクトを
指さなければならない。そうでないと、C++の意味規
則の違反となる。例えば、上記のプログラムコード例に
おける代入文「pp=ps;」の後では、ポインタpp
40(personオブジェクトへのポインタとして宣
言されている)は、personサブオブジェクト36
の先頭を指しているが、ポインタps39(stude
ntオブジェクトへのポインタとして宣言されている)
はstudentオブジェクト31の先頭を指してい
る。
【0033】プログラムコード例において代入文「pp
=ps;」の実行後に、関数呼び出し「pp−>pri
nt();」が実行される。ポインタpp40はper
sonサブオブジェクト36を指しているため、この呼
び出しは、vtblポインタ22によるperson
vtbl28への間接参照を要求する。適切な関数のア
ドレス、すなわち、&student::print
が、person vtbl28から取得されることに
なる。しかし、student::printは、st
udentオブジェクトのアドレスをその引数として受
け取ることを要求する。従ってこのアドレスが、ポイン
タpp40から、person vtbl28に格納さ
れているdelta(student,person)
の値を減算することによって計算される。
【0034】図3のstudentオブジェクト31の
例と同様にして、図4に、employeeオブジェク
ト41のメモリ配置を示す。この配置の第1の部分は、
クラスemployeeに特有なデータからなる。この
部分は、employeevtbl56を指すvtbl
ポインタ42から始まる。次に、この配置は、empl
oyeeオブジェクト41の配置の第2の部分、すなわ
ち、personサブオブジェクト36を指すvbas
eポインタ33を含む。personサブオブジェクト
36は、person vtbl29を指すvtblポ
インタ22と、サブクラスpersonのデータメンバ
のエントリ、すなわち、firstname23、la
stname24およびage25とからなる。vba
seポインタ33の次に、employeeオブジェク
ト41のメモリ配置は、クラスemployeeの特有
のデータメンバ、すなわち、company43および
salary44を含む。
【0035】employee vtbl45は、em
ployeeオブジェクト41とともにその引数として
呼び出されたときに呼ばれるprint関数の適当なバ
ージョンのアドレス、すなわち、&employe
e::printを含む。さらに、person vt
bl29は、アドレス&employee::prin
tを含むのみならず、基本クラスサブオブジェクト(p
ersonサブオブジェクト36)のアドレスが与えら
れた場合に派生クラスオブジェクト(employee
オブジェクト41)のアドレスを発見するために使用さ
れるオフセットをも含む。この値はdelta(emp
loyee,person)であって、employe
eオブジェクト41におけるvtblポインタ22とv
tblポインタ42のアドレスの差に等しい。
【0036】上記で指摘したように、personはs
tudentの仮想基本クラスとして宣言されているた
め、studentオブジェクトのperson要素へ
の参照は、vbaseポインタというポインタを通じて
の間接参照を要求する。図3および図4に示したstu
dentオブジェクト31およびemployeeオブ
ジェクト41の各場合には、この間接参照は不要に思わ
れるかもしれない。これらの場合には、ただ1つのvb
aseポインタしか存在しないため、容易に固定オフセ
ットで置き換えることも可能と考えられる。しかし、多
重継承を使用して指定される型のオブジェクトにおける
仮想基本クラスの共用を実現するためには、このような
間接参照が必要となる。
【0037】図5に、このような多重継承が指定されて
いるクラスであるstudent_employeeオ
ブジェクト51のメモリ配置を示す。特に、図示したs
tudent_employeeオブジェクト51のメ
モリ配置は、図4にあったようなemployeeサブ
オブジェクト57の表現から始まる。
【0038】特に、これは、employee/stu
dent_employee vtbl54を指すvt
blポインタ42を含む。employee/stud
ent_employee vtbl54は、stud
ent_employeeオブジェクト51とともにそ
の引数として呼び出されたときに呼ばれるprint関
数の適当なバージョンのアドレス、すなわち、&stu
dent_employee::printを含む。注
意すべきことであるが、student_employ
eeオブジェクト全体に対して使用されるのと同じvt
blがemployeeサブオブジェクトに対して使用
される。この最適化はほとんどのC++処理系で利用さ
れている。特に、派生クラスオブジェクトと、その最初
の非仮想基本クラスサブオブジェクトに対して、同じア
ドレスを割り当てることができるため、それらのvtb
lの共用が可能となる。この最適化の結果、stude
nt_employeeオブジェクト自身の特有のデー
タメンバは、メモリ配置内で後回しになる。
【0039】vtblポインタ52の後には、pers
onサブオブジェクトを表すstudent_empl
oyeeオブジェクト51の部分、すなわち、pers
onサブオブジェクト36、を指すvbaseポインタ
33の第1のインスタンスがある。この後には、データ
メンバcompany43およびsalary44があ
る。これらは、employeeサブオブジェクト57
に特有のデータメンバである。次に、studentサ
ブオブジェクト58の表現があり、これは図3にあった
のと同じである。特に、これは、vtblポインタ32
と、vbaseポインタ33の第2のインスタンスと、
studentサブオブジェクトの特有のデータメンバ
であるuniversity34とを含む。vtblポ
インタ32は、student_employeeオブ
ジェクト51とともにその引数として呼び出されたとき
に呼ばれるprint関数の適当なバージョンのアドレ
ス、すなわち、&student_employe
e::printを含むstudent vtbl55
を指す。vbaseポインタ33の第2インスタンスも
また、personサブオブジェクトを表すstude
nt_employeeオブジェクト51の部分、すな
わち、personサブオブジェクト36を指す。注意
すべきことであるが、仮想基本クラス共用を実現するた
めには、vbaseポインタ33のいずれのインスタン
スも、同じpersonサブオブジェクト36を指す必
要がある。
【0040】studentサブオブジェクト58に続
いて、student_employeeオブジェクト
自身の特有のデータメンバであるmaxhours53
がある。最後に、personサブオブジェクトの単一
の表現であるpersonサブオブジェクト36があ
る。これは、student_employeeオブジ
ェクト51とともにその引数として呼び出されたときに
呼ばれるprint関数の適当なバージョンのアドレ
ス、すなわち、&student_employe
e::printを含むperson vtbl56を
指すvtblポインタ22を含む。
【0041】[持続性と隠蔽ポインタ問題]上記のよう
に、データオブジェクトを例えばディスクに保存し、後
のプログラム呼び出しにおいて後でそれを読み込む能力
は、そのデータオブジェクトが持続的であることを要求
する。換言すれば、そのデータオブジェクトは複数のプ
ログラム呼び出しにわたって有効でなければならない。
仮想関数および仮想基本クラスは、これらのファシリテ
ィを実現する際にC++コンパイラによって生成される
隠蔽されたvtblポインタおよびvbaseポインタ
のために、持続性に悪影響を与える。上記のように、仮
想関数呼び出しには、仮想関数テーブル内のエントリに
アクセスするためにvtblポインタを使用する間接参
照がかかわる。仮想基本クラスの要素への参照は、vb
aseポインタによらなければならない。vtblポイ
ンタおよびvbaseポインタは、処理系に関連する情
報を表し、ユーザからは見えないため、隠蔽されたポイ
ンタである。換言すれば、C++には、ユーザがこれら
のポインタを直接操作することができるような機構はな
い。
【0042】残念ながら、隠蔽ポインタは、それを作成
したプログラムの呼び出しを越えては有効でないため、
揮発性である。隠蔽ポインタを含むオブジェクトをディ
スクに保存し、後で他のプログラムで(または同じプロ
グラムの後の呼び出しで)メモリにそのオブジェクトを
読み戻すと、隠蔽ポインタは無効になる。これらのポイ
ンタが「調整」されないため、仮想関数または仮想基本
クラスの要素への参照は、(無意味でなければ)違法な
メモリ参照となることが多い。もちろん、それ自身揮発
性であるポインタであるデータメンバの値についても同
じことが成り立つ。しかし、データメンバの場合には、
プログラマは、無効な値のポインタとして使用されない
ことを保証することができる。例えば、他の表現(例え
ば添字)を使用することができる。プログラマは、これ
らのデータメンバの存在を十分に知っており、メモリ参
照問題を回避するようにそれらを直接操作することがで
きる。しかし、隠蔽ポインタの場合、ユーザはこのよう
な直接制御はできない。
【0043】[修正されたオブジェクト作成プロセスに
よる隠蔽ポインタの調整]本発明の実施例によれば、隠
蔽ポインタを有するデータオブジェクトを持続的にする
方法が実現される。特に、ユーザ定義クラスの各データ
オブジェクトは、オブジェクト指向言語では、ある既存
のオブジェクト作成プロセスを適用することによって作
成される。C++ではこのプロセスはnew演算子とし
て知られている。本発明の一実施例の方法は、このオブ
ジェクト作成プロセスを、その機能を制限するように修
正することを含む。続いて、この修正されたプロセス
は、データオブジェクトを作成したプログラム呼び出し
の後のプログラム呼び出しによってメモリに(例えばデ
ィスクから)読み込まれたデータオブジェクトに適用さ
れる。
【0044】C++におけるnew演算子の呼び出しに
よるオブジェクト作成プロセスの通常の動作を図6に示
す。ステップ61は、与えられたデータオブジェクト
(例えば図2〜図5参照)を表現するのに要する適当な
量のメモリ空間の割当(例えば、「ヒープ」のような空
き記憶領域からメモリ空間を割り当てることによって)
からなる。このメモリ量は、ユーザによって提供される
クラスの仕様に基づいて容易に決定される。
【0045】ステップ62は、割り当てられたメモリ空
間におけるクラス(およびサブクラス)のデータメンバ
の初期化からなる。このステップは、ユーザが、新しい
データオブジェクトを作成する際に、どのデータメンバ
をとのような値に初期化すべきかに関する情報を提供す
ることもしないこともあるという点で、オプションであ
る。C++では、このような初期化は、一般的に、「コ
ンストラクタ」として知られるユーザ提供初期化ルーチ
ンを呼び出すことによって実現される。ユーザがこのよ
うなコンストラクタを提供しない場合、データメンバ
は、そのオブジェクトの作成時に特定の値に初期化され
ないことになる。
【0046】最後に、ステップ63は、データオブジェ
クトに含まれるすべての隠蔽ポインタの初期化と、必要
であれば、対応する仮想関数テーブルの作成とからな
る。このステップは、クラス(およびサブクラス)の仕
様に含まれるもの以外のユーザからの情報を要求しな
い。C++実行時システムは、クラス仕様と、システム
のメモリ空間内のさまざまな情報(例えば、仮想関数の
コード)の設定に基づいて、これらのポインタがそれぞ
れどのアドレスを指さなければならないかを知ることに
なる。
【0047】ステップ62とステップ63の実行順序は
重要ではない。new演算子の実行は、いずれのステッ
プを最初に実行してもよく、それらを絡み合わせても良
い。特に、ステップ62とステップ63の組合せは、与
えられたデータオブジェクトに対する(全体的な)コン
ストラクタの適用とみなされることも多い。特に、C+
+コンパイラは、ステップ62を実行するためのユーザ
提供コンストラクタに、ステップ63を実現するのに要
するコードを追加する。ユーザ提供コンストラクタが存
在しない場合、得られるコンストラクタは追加されたコ
ードのみからなる。
【0048】図7に、本発明の実施例によってオブジェ
クト作成プロセス(例えば、new演算子の作用の機
能)になされる修正を示す。特に、プロセスの修正バー
ジョンでは、ステップ61およびステップ62は回避さ
れ、ステップ63のみが実行される。このようにして、
隠蔽ポインタは有効なアドレス値に初期化され、しか
も、新たなデータオブジェクトは作成されない(すなわ
ち、メモリ割当はない)。さらに、このデータオブジェ
クトのデータメンバの値はもとのままである。
【0049】図8は、データオブジェクトを作成したプ
ログラム呼び出しの後のプログラム呼び出しによってメ
モリに読み込まれたデータオブジェクトに対して、図7
の修正されたオブジェクト作成プロセスを適用すること
を説明する図である。特に、ステップ71は、前に作成
されたデータオブジェクトをメモリに読み込む。その結
果、所望のオブジェクトがメモリに存在することになる
が、それは無効なポインタを含む。次に、ステップ63
のみからなる(ステップ61やステップ62はない)修
正されたオブジェクト作成プロセス72が、このデータ
オブジェクトに適用され、隠蔽ポインタが調整される。
【0050】本発明のもう1つの目的によって、図7の
プロセスは、既存のオブジェクト作成プロセスを変更せ
ずに直接作成することも可能である。特に、既存のデー
タオブジェクトに含まれる隠蔽ポインタは、新たにメモ
リを割り当てたり、そのオブジェクト内のデータメンバ
の内容を乱したりすることなく、初期化される。このよ
うにして、上記の修正手順によって作成されるのと同等
のプロセスが生成される。すなわち、プロセスは図7の
ステップ63からなる。この直接作成されたプロセス
を、既存のデータオブジェクトに適用して、上記の修正
されたオブジェクト作成プロセスの場合と同様にして図
8のように隠蔽ポインタが調整される。
【0051】[修正されたオブジェクト作成プロセスの
C++実現]上記で指摘したように、演算子newはC
++オブジェクト作成機構である。従って、メモリの割
当およびデータメンバの初期化を回避するようにこの演
算子の呼び出しの通常のプロセスを修正する必要があ
る。
【0052】メモリの割当を回避するため、new演算
子はoperator newの新しいバージョンを定
義することによって多重定義される。通常のC++プロ
グラマには周知のように、関数名が複数の異なる意味を
有する場合にその関数名は「多重定義」されたという。
特に、特定の使用で意図されている意味はその文脈によ
って決定される。C++では、引数の数またはデータ型
のいずれかにおいて各シグニチャ(引数構造)が一意的
である限り、複数の関数に同じ名前を与えることができ
る。
【0053】特に、読み込んだデータオブジェクトが格
納される位置のアドレスが、operator new
のこの新しいバージョンに渡される。この関数は、その
結果として、新しい記憶領域を割り当てることなく、単
にそれと同じアドレスを返す。しかし、この関数呼び出
しによって、適当なコンストラクタが呼び出される。以
下のC++コードは多重定義されたoperator
newを定義する。
【0054】クラス_odeは、newの多重定義され
た定義が呼び出されることを保証するために定義された
固有のデータ型である。注意すべきことであるが、C+
+は、関数operator newの多重定義された
定義の第1パラメータがsize_t型であることを要
求し、さらに、newがvoid *型の値を返すこと
を要求する。
【0055】例えば、pは、メモリに読み込まれたem
ployeeオブジェクトを指すと仮定する。すると、
operator newの多重定義された定義は、C
++コードの以下の行によって、与えられたemplo
yeeオブジェクトに作用する。 new ((_ode *) p) employee;
【0056】演算子newのこの呼び出しは、新たな記
憶領域を割り当てないが、クラスemployeeに対
する引数のないコンストラクタを呼び出す。従って、デ
ータオブジェクト内のデータメンバの初期化を回避する
ためには、このコンストラクタは、呼び出されたときに
ユーザが指定したコンストラクタコード(もし存在すれ
ば)を実行しないように修正しなければならない。この
ようにして、これは隠蔽ポインタを初期化するだけとな
る。これは、コンストラクタが隠蔽ポインタを調整する
ためにのみ呼び出されているのか否かを示すフラグとし
て作用するグローバル変数_fix_hiddenを定
義することによって実現される。この変数は、例えば、
C++コードの以下の行によって宣言される。 short _fix_hidden;
【0057】_fix_hiddenフラグは、コンス
トラクタが、修正されたオブジェクト作成プロセス(す
なわち、多重定義されたoperator new)に
よって呼び出されている場合と、もとの無修正のオブジ
ェクト作成プロセスによって呼び出されている場合とを
区別するために使用される。特に、クラスDが、以下の
形のユーザ指定コンストラクタを定義すると仮定する。
【0058】添字optは、このパラメータ宣言がオプシ
ョンであることを示す。これは、コンストラクタ関数は
引数を有することも有しないことも可能であるためであ
る。このコンストラクタは、他のユーザ指定コンストラ
クタとともに、以下のように変換される。
【0059】この変換によって、グローバル変数_fi
x_hiddenがセットされている(すなわち、0で
ない)場合には、このコンストラクタが呼び出されると
きにユーザ指定コードは実行されない。従って、読み込
んだオブジェクトのデータメンバは変更されない(すな
わち、初期化されない)ことになる。しかし、コンスト
ラクタ定義内に存在する初期化子がデータメンバを変更
しないことを保証する必要がある。通常のC++プログ
ラマには周知のように、初期化子はコンストラクタ本体
の直前に以下のように与えられる。
【0060】初期化子は、オブジェクトのデータメンバ
とともに、(他のコンストラクタ呼び出しによる)基本
クラスの要素を初期化するために使用される。それ自体
がコンストラクタ呼び出しである初期化子は修正する必
要がない。それは、そのコンストラクタ関数はそれ自体
グローバル変数_fix_hiddenの値に基づいて
条件付きで実行されるように修正されるためである。し
かし、データメンバの初期値を指定する初期化子は、そ
のコンストラクタが、新たに作成したオブジェクトを初
期化するために呼び出されているのであってメモリに読
み込んだオブジェクトの隠蔽ポインタを調整するために
呼び出されているのではない場合にのみデータメンバの
値を変更するように修正される。例えば、以下の形の初
期化子(ただしmはデータメンバ) m(初期値) は、次の初期化子に変換される。 m(_fix_hidden ? m : 初期値)
【0061】このようにして、グローバル変数_fix
_hiddenがセットされている場合、初期化子はメ
ンバをそれ自身に代入し、データメンバの現在の値をそ
のままにする。
【0062】隠蔽ポインタの初期化、すなわち、図8の
修正されたオブジェクト作成プロセス72は、各クラス
に対して生成される単一のメンバ関数reinit内に
カプセル化することができる。例えば、クラスstud
ent_employeeに対するreinit関数の
本体は、以下のC++コードからなる。
【0063】特に、関数reinitは、new演算子
の多重定義バージョン(これは記憶領域を割り当てな
い)を呼び出す前にグローバル変数_fix_hidd
enを1にセットする。new演算子呼び出しの結果と
して呼び出されるコンストラクタは、_fix_hid
denがセットされているのを知るため、コンストラク
タ内のユーザ指定コードの実行も、初期化子によるデー
タメンバ値の変更もしない。唯一の効果は、隠蔽ポイン
タのアドレスを適当な値に変更することによってそれを
調整することである。続いて、関数reinitは、復
帰する前にグローバル変数_fix_hiddenを0
に戻す。
【0064】以上の説明では、オブジェクト指向の言語
および実例への主な言及は、C++言語およびその実例
によって記載したが、場合に応じて他のオブジェクト指
向の文脈でも同様のことが可能である。さらに、コンパ
イラへの言及は、トランスレータ、インタプリタ、およ
び、ソースコードが処理され、それによって、指定した
機能が直接的または間接的に実行されるその他の手段を
含むものとみなすべきである。
【0065】
【発明の効果】以上述べたごとく、本発明によれば、C
++のようなオブジェクト指向言語の意味規則の変更を
必要とせずに、隠蔽ポインタを含むデータオブジェクト
を持続的にすることが可能となる。
【図面の簡単な説明】
【図1】C++のようなオブジェクト指向プログラミン
グ言語によって提供される派生クラス機能を示すユーザ
定義データ型階層の図である。
【図2】プログラミング言語C++の処理系における図
1のデータオブジェクトの一般的なメモリ表現の図であ
って、特に、personオブジェクトのメモリ配置を
示す図である。
【図3】プログラミング言語C++の処理系における図
1のデータオブジェクトの一般的なメモリ表現の図であ
って、特に、studentオブジェクトのメモリ配置
の図である。
【図4】プログラミング言語C++の処理系における図
1のデータオブジェクトの一般的なメモリ表現の図であ
って、特に、employeeオブジェクトのメモリ配
置の図である。
【図5】プログラミング言語C++の処理系における図
1のデータオブジェクトの一般的なメモリ表現の図であ
って、特に、student_employeeオブジ
ェクトのメモリ配置の図である。
【図6】C++におけるnew演算子の適用によって得
られるオブジェクト作成プロセスの一般的動作を示す図
である。
【図7】本発明の実施例によるオブジェクト作成プロセ
スへの修正を説明する図である。
【図8】本発明の実施例によって以前に作成されたデー
タオブジェクトに図7の修正オブジェクト作成プロセス
を適用する図である。
【符号の説明】
12 クラスperson 14 クラスstudent 16 クラスemployee 21 personオブジェクト 22 vtblポインタ 31 studentオブジェクト 32 vtblポインタ 33 vbaseポインタ 36 personサブオブジェクト 39 ポインタps 40 ポインタpp 41 employeeオブジェクト 42 vtblポインタ 51 student_employeeオブジェクト 57 employeeサブオブジェクト 58 studentサブオブジェクト
───────────────────────────────────────────────────── フロントページの続き (72)発明者 アレキサンドロス ビリリス アメリカ合衆国、02174 マサチューセッ ツ、アーリントン、メノトミー ロード 79 (72)発明者 シャウル ダー アメリカ合衆国、53705 ウィスコンシン、 マディソン、アパートメント 6、チェン バレン アベニュー 402 (72)発明者 ナレイン エイチ.ゲハニ アメリカ合衆国、07901 ニュージャージ ー、サミット、ベバリー ロード 25

Claims (23)

    【特許請求の範囲】
  1. 【請求項1】 メモリ内の正しい位置を参照するように
    無効なポインタを変更する変更ステップからなることを
    特徴とする、無効なポインタを有する既存のデータオブ
    ジェクトを処理する方法。
  2. 【請求項2】 前記変更ステップが、前記既存のデータ
    オブジェクトに、修正されたオブジェクト作成プロセス
    を適用して前記無効なポインタの前記変更を実行する適
    用ステップからなり、前記修正されたオブジェクト作成
    プロセスは、作成されるデータオブジェクトに対するメ
    モリ内のメモリ空間の割当のステップと、そのデータオ
    ブジェクト内のデータの初期化のステップと、そのデー
    タオブジェクト内のポインタの初期化のステップとから
    なるオブジェクト作成プロセスを、前記メモリ空間の割
    当および前記データの初期化が選択的に禁止されるよう
    に修正することによって形成されることを特徴とする請
    求項1の方法。
  3. 【請求項3】 前記既存のデータオブジェクトは第1の
    プログラム呼び出しの実行中に前記オブジェクト作成プ
    ロセスによって作成され、前記適用ステップは第2のプ
    ログラム呼び出しの実行中に実行されることを特徴とす
    る請求項2の方法。
  4. 【請求項4】 前記無効なポインタが隠蔽ポインタであ
    ることを特徴とする請求項3の方法。
  5. 【請求項5】 前記オブジェクト作成プロセスが、オブ
    ジェクト指向プログラミング言語で書かれたプログラム
    ソースコードを反映するプログラム実行可能コードから
    なることを特徴とする請求項3の方法。
  6. 【請求項6】 前記オブジェクト指向プログラミング言
    語がプログラミング言語C++であり、前記プログラム
    ソースコードがnew演算子であることを特徴とする請
    求項5の方法。
  7. 【請求項7】 前記修正されたオブジェクト作成プロセ
    スが、new演算子の多重定義されたバージョンからな
    るプログラムソースコードを反映するプログラム実行可
    能コードからなることを特徴とする請求項5の方法。
  8. 【請求項8】 前記無効なポインタが隠蔽ポインタであ
    り、前記オブジェクト指向プログラミング言語がプログ
    ラミング言語C++であり、前記プログラムソースコー
    ドがnew演算子であることを特徴とする請求項7の方
    法。
  9. 【請求項9】 前記オブジェクト作成プロセスが、前記
    データの初期化のためのユーザ定義初期化プロセスをさ
    らに有し、そのユーザ定義初期化プロセスは、そのユー
    ザ定義初期化プロセスが前記修正されたオブジェクト作
    成プロセスによって呼び出されるときに前記データの初
    期化が選択的に禁止されるように修正されていることを
    特徴とする請求項2の方法。
  10. 【請求項10】 前記適用ステップが、グローバル変数
    をあらかじめ決められた値にセットするステップからな
    り、前記ユーザ定義初期化プロセスは、前記グローバル
    変数が前記あらかじめ決められた値にセットされている
    ときに前記データの初期化が選択的に禁止されるように
    修正されていることを特徴とする請求項9の方法。
  11. 【請求項11】 前記既存のデータオブジェクトは第1
    のプログラム呼び出しの実行中に前記オブジェクト作成
    プロセスによって作成され、前記適用ステップは第2の
    プログラム呼び出しの実行中に実行されることを特徴と
    する請求項10の方法。
  12. 【請求項12】 前記無効なポインタが隠蔽ポインタで
    あることを特徴とする請求項11の方法。
  13. 【請求項13】 前記オブジェクト作成プロセスが、オ
    ブジェクト指向プログラミング言語で書かれたプログラ
    ムソースコードを反映するプログラム実行可能コードか
    らなることを特徴とする請求項11の方法。
  14. 【請求項14】 前記オブジェクト指向プログラミング
    言語がプログラミング言語C++であり、前記プログラ
    ムソースコードがnew演算子であることを特徴とする
    請求項13の方法。
  15. 【請求項15】 前記修正されたオブジェクト作成プロ
    セスが、new演算子の多重定義されたバージョンから
    なるプログラムソースコードを反映するプログラム実行
    可能コードからなることを特徴とする請求項13の方
    法。
  16. 【請求項16】 前記無効なポインタが隠蔽ポインタで
    あり、前記オブジェクト指向プログラミング言語がプロ
    グラミング言語C++であり、前記プログラムソースコ
    ードがnew演算子であることを特徴とする請求項15
    の方法。
  17. 【請求項17】 前記変更ステップが、前記既存のデー
    タオブジェクトに、修正されたオブジェクト作成プロセ
    スを適用して前記無効なポインタの前記変更を実行する
    適用ステップからなり、前記修正されたオブジェクト作
    成プロセスは、作成されるデータオブジェクトに対する
    メモリ内のメモリ空間の割当のステップと、そのデータ
    オブジェクト内のポインタの初期化のステップとからな
    るオブジェクト作成プロセスを、前記メモリ空間の割当
    が選択的に禁止されるように修正することによって形成
    されることを特徴とする請求項1の方法。
  18. 【請求項18】 前記既存のデータオブジェクトは第1
    のプログラム呼び出しの実行中に前記オブジェクト作成
    プロセスによって作成され、前記適用ステップは第2の
    プログラム呼び出しの実行中に実行されることを特徴と
    する請求項17の方法。
  19. 【請求項19】 前記無効なポインタが隠蔽ポインタで
    あることを特徴とする請求項18の方法。
  20. 【請求項20】 前記オブジェクト作成プロセスが、オ
    ブジェクト指向プログラミング言語で書かれたプログラ
    ムソースコードを反映するプログラム実行可能コードか
    らなることを特徴とする請求項18の方法。
  21. 【請求項21】 前記オブジェクト指向プログラミング
    言語がプログラミング言語C++であり、前記プログラ
    ムソースコードがnew演算子であることを特徴とする
    請求項20の方法。
  22. 【請求項22】 前記修正されたオブジェクト作成プロ
    セスが、new演算子の多重定義されたバージョンから
    なるプログラムソースコードを反映するプログラム実行
    可能コードからなることを特徴とする請求項20の方
    法。
  23. 【請求項23】 前記無効なポインタが隠蔽ポインタで
    あり、前記オブジェクト指向プログラミング言語がプロ
    グラミング言語C++であり、前記プログラムソースコ
    ードがnew演算子であることを特徴とする請求項22
    の方法。
JP6082726A 1993-03-30 1994-03-30 データオブジェクト処理方法 Pending JPH06324859A (ja)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US4032793A 1993-03-30 1993-03-30
US040327 1993-03-30

Publications (1)

Publication Number Publication Date
JPH06324859A true JPH06324859A (ja) 1994-11-25

Family

ID=21910395

Family Applications (1)

Application Number Title Priority Date Filing Date
JP6082726A Pending JPH06324859A (ja) 1993-03-30 1994-03-30 データオブジェクト処理方法

Country Status (3)

Country Link
US (1) US5590327A (ja)
EP (1) EP0620520A1 (ja)
JP (1) JPH06324859A (ja)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6202098B1 (en) 1995-01-04 2001-03-13 International Business Machines Corporation Method and system for object oriented notification
JP2006285443A (ja) * 2005-03-31 2006-10-19 Oki Electric Ind Co Ltd オブジェクト救済システム及び方法
JP2009129206A (ja) * 2007-11-22 2009-06-11 Toshiba Corp 情報処理装置、プログラム検証方法及びプログラム

Families Citing this family (28)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6785690B1 (en) * 1996-03-18 2004-08-31 Hewlett-Packard Development Company, L.P. Method and system for storage, retrieval, and query of objects in a schemeless database
US5805887A (en) * 1996-05-31 1998-09-08 International Business Machines Corporation Universal pointer object
US5751613A (en) * 1996-09-03 1998-05-12 Doty; Douglas E. Persistent heap for dynamic picture objects
US5794256A (en) * 1996-12-12 1998-08-11 Microsoft Corporation Pointer swizzling facility using three-state references to manage access to referenced objects
US6240466B1 (en) 1997-04-21 2001-05-29 International Business Machines Corporation Object-oriented apparatus and method for determining new object location relative to an existing object
US5943497A (en) * 1997-04-30 1999-08-24 International Business Machines Corporation Object-oriented apparatus and method for controlling configuration of object creation
US6173439B1 (en) * 1998-03-11 2001-01-09 International Business Machines Corporation Interface mechanism and method for accessing non-object oriented data from within an object oriented framework
KR100280820B1 (ko) 1998-03-19 2001-02-01 정선종 C++ 객체지향 프로그래밍 시스템에서의 객체에 영속성부여 방법
US6792606B2 (en) 1998-07-17 2004-09-14 International Business Machines Corporation Method and apparatus for object persistence
US6708181B1 (en) 1998-09-01 2004-03-16 International Business Machines Corporation System and method for initializing variables in an object-oriented program
US6397203B1 (en) * 1998-09-30 2002-05-28 International Business Machines Corporation Defining object classes to match corresponding specialized data types in a relational database
US6857123B1 (en) 1998-12-18 2005-02-15 International Business Machines Corporation Method and apparatus for a Meta Data Service in a data processing system
US6408305B1 (en) * 1999-08-13 2002-06-18 International Business Machines Corporation Access frontier for demand loading pages in object-oriented databases
US6754887B1 (en) * 1999-10-22 2004-06-22 International Business Machines Corporation Methods for implementing virtual bases with fixed offsets in object oriented applications
US6842786B1 (en) * 2001-02-09 2005-01-11 Adobe Systems Incorporated Method and apparatus for remote communication of data associated with dynamically generated type object at runtime to describe the data type
US7069540B1 (en) * 2001-07-02 2006-06-27 Unisys Corporation COM persistence model
US7080354B2 (en) * 2002-03-29 2006-07-18 Intel Corporation Method for implementing dynamic type checking
EP2619687B1 (en) * 2010-09-24 2016-04-06 Intel Corporation Sharing virtual functions in a shared virtual memory between heterogeneous processors of a computing platform
US9384711B2 (en) 2012-02-15 2016-07-05 Microsoft Technology Licensing, Llc Speculative render ahead and caching in multiple passes
US9235925B2 (en) * 2012-05-31 2016-01-12 Microsoft Technology Licensing, Llc Virtual surface rendering
US9177533B2 (en) 2012-05-31 2015-11-03 Microsoft Technology Licensing, Llc Virtual surface compaction
US9230517B2 (en) 2012-05-31 2016-01-05 Microsoft Technology Licensing, Llc Virtual surface gutters
US9286122B2 (en) 2012-05-31 2016-03-15 Microsoft Technology Licensing, Llc Display techniques using virtual surface allocation
US9307007B2 (en) 2013-06-14 2016-04-05 Microsoft Technology Licensing, Llc Content pre-render and pre-fetch techniques
US9910591B2 (en) * 2014-11-05 2018-03-06 Oracle International Corporation Visualizations of memory layouts in software programs
US10353793B2 (en) 2014-11-05 2019-07-16 Oracle International Corporation Identifying improvements to memory usage of software programs
US10275154B2 (en) * 2014-11-05 2019-04-30 Oracle International Corporation Building memory layouts in software programs
CN109324842A (zh) * 2017-07-31 2019-02-12 武汉斗鱼网络科技有限公司 程序启动所需资源创建方法、存储介质、设备及方法

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH0658646B2 (ja) * 1982-12-30 1994-08-03 インタ−ナショナル・ビジネス・マシ−ンズ・コ−ポレ−ション デ−タ持続性が制御される仮想記憶アドレス変換機構
US4814971A (en) * 1985-09-11 1989-03-21 Texas Instruments Incorporated Virtual memory recovery system using persistent roots for selective garbage collection and sibling page timestamping for defining checkpoint state
US4853842A (en) * 1985-09-11 1989-08-01 Texas Instruments Incorporated Computer memory system having persistent objects
US5293630A (en) * 1989-09-28 1994-03-08 Texas Instruments Incorporated Method of returning a data structure from a callee function to a caller function for the C programming language
US5297279A (en) * 1990-05-30 1994-03-22 Texas Instruments Incorporated System and method for database management supporting object-oriented programming

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6202098B1 (en) 1995-01-04 2001-03-13 International Business Machines Corporation Method and system for object oriented notification
JP2006285443A (ja) * 2005-03-31 2006-10-19 Oki Electric Ind Co Ltd オブジェクト救済システム及び方法
JP4517923B2 (ja) * 2005-03-31 2010-08-04 沖電気工業株式会社 オブジェクト救済システム及び方法
US8230254B2 (en) 2005-03-31 2012-07-24 Oki Electric Industry Co., Ltd. Redundant system using object-oriented program and method for rescuing object-oriented program
JP2009129206A (ja) * 2007-11-22 2009-06-11 Toshiba Corp 情報処理装置、プログラム検証方法及びプログラム

Also Published As

Publication number Publication date
EP0620520A1 (en) 1994-10-19
US5590327A (en) 1996-12-31

Similar Documents

Publication Publication Date Title
JPH06324859A (ja) データオブジェクト処理方法
US7225438B2 (en) Lazy compilation of template-generated classes in dynamic compilation execution environments
US5915253A (en) Method and system for implementing objects in a storage system
Box et al. Essential. Net: the common language runtime
US5371891A (en) Method for object construction in a compiler for an object-oriented programming language
US5940616A (en) Tracker class for object-oriented programming environments
US6167565A (en) Method and system of custom marshaling of inter-language parameters
US6108661A (en) System for instance customization
US7219329B2 (en) Systems and methods providing lightweight runtime code generation
US20030066051A1 (en) Function values in computer programming languages having dynamic types and overloading
US6526457B1 (en) Systems utility object interface for facilitating software portability
WO2006099061A2 (en) Dynamic creation of proxy software objects at time of execution
US20040268301A1 (en) Adding new compiler methods to an integrated development environment
Balter et al. The Guide language
JP3672334B2 (ja) オブジェクト集合方法およびシステム
Hunt et al. Intercepting and Instrumenting COM Applications.
Cohen et al. Better Construction with Factories.
Chiba Open C++ release 1.2 Programmer's guide
Pautet et al. CORBA & DSA: Divorce or marriage?
Linton et al. Interface Translation and Implementation Filtering.
Hamilton Interlanguage Object Sharing with SOM.
Gabbrielli et al. Object-Oriented Paradigm
Walsh et al. The Commandos Supported Programming Languages
Rogers et al. Openada: Compile-time reflection for ada 95
Baldwin et al. The Elements of C# Style