2011-02-03 10 views
2

私はブルース・エッケル'S Cで考える++アクセス指定子は

1.Access指定子から次の文を読ん構造の一部であると構造」から作成されたオブジェクト
に影響を与えません

疑問:アクセスブロックが連続して格納されていないことを知っているので、 アクセス指定子がメモリ内のオブジェクトレイアウトを変更することはありません。

2.プログラムが実行される前にすべてのアクセス指定情報が消えます
(コンパイル中)。実行中のプログラムでは、オブジェクトが「記憶領域」になります
となります。 ?それは1でも直接プライベートメンバにアクセスできることを意味しない、私は上記の文を理解する助けてください

3.C++デザインです。そして

疑いがC

に直接
することができますようにメモリにアクセス実用的であり、熱望していない取引を抽象化する

疑問:実用的であるという意味は?

答えて

7

1)アクセス指定子同じアクセス特定内の​​データメンバのレイアウトの順序()(、実際の構造の一部であり、「構造」から作成されたオブジェクトには影響を与えません。間違った

public,protectedまたはprivate)は、コード内での順序によって指定されますが、異なる指定子を持つデータメンバーに対しては順序は指定されません。

class Foo 
{ 
public: 
    int a; 
    int b; 
protected: 
    int c; 
    int d; 
}; 

私たちが知っている唯一のものはab前に来なければならないとcd前に来なければならないということです。 abcd,acbd,acdb,cabd,cadbおよびcdabが可能である。

2)アクセス仕様情報のすべてのプログラムはコンパイル時に( を実行する前に消える)実行中のプログラム.IN、オブジェクトは、「ストレージの領域」 、より何になる...ので、私たちはすべての破ることができます規則とメモリに直接アクセスする できるだけ早く

この情報はコンパイル時にのみ使用されますが、コンパイルは実行コードを生成するものです。したがって、コンパイルにより、privateのメンバーにアクセスすることはありません。しかし、ダイレクトメモリ操作が許可されているので、あなたは効果的にprivateメンバーまたは機能にアクセスすることができます。

3)は、C++を抽象化するために、それは純粋に理論的な引数のために少し考慮して、実際の使用に向けの本当の

実用的な手段を熱望していない、実用的になるように設計されています。 CS理論から構築された言語は、例えば、非常に健全な数学的背景を有するHaskellを含む。一方、C++には、ユーザーにとって有用と思われる機能が蓄積されています。

また、C++では、(メモリ管理のような)低レベルの詳細が隠されることはありません。良いC++コードは一般に、コンパイラに任せ、イディオムを使用して抽象化しようとしますが、必要に応じて常にアセンブリコードを直接組み込んでも金属に近づけることができます。あなたがしていることに注意を払う必要があります。

memset(&foo, int 0, sizeof(foo)); // wipes them all 
fwrite(&foo, sizeof(foo), 1, fp); // dumps them to stream fp 

いくつかのコメンターが指摘したように、これはC++標準の下で未定義の動作を誘発するので、あなたは、この(またはそれを試みる前に、あなたのコンパイラを知っている:あなたは非常に簡単にプライベートメンバ変数に取得することができ

+0

ありがとうございます – user388338

1
class Foo { 
    int x, y; 
    public: 
    int z; 
    Foo(int a, int b) : x(a), y(b) {} 
}; 
Foo foo; 

、しないでください)。あなたはコンパイラがクラスのパック方法を知っているならば、あなたも、このような

struct PublicFoo { 
    int x, y, z; // order, padding, etc. depends on compiler 
}; 

PublicFoo *Foo *をキャストとしてハックすることで、よりきめ細かなアクセスを得ることができます。 C++ランタイムの何もそれを防ぎません。

+0

定義されていない動作を実行することを除いて、 – GManNickG

+1

もちろん、これは未定義の動作であり、コンピュータを起動する可能性があります。 – MSalters

+2

UDに関する注釈を追加しました。しかし、コンパイラがこの構造体の 'SLFDSTRCT'命令を発行しないことが分かっているなら、それを動作させるかもしれません。 –

関連する問題