1

<C++ primer (3rd)>以下は、 Stanley B. Lippman Josée Lajoie によるの第 7.6 章からの抜粋です。

inline として指定された関数は、関数が呼び出されたプログラム内の各ポイントで「インライン」に展開されます。例えば、

int minVal2 = min( i, j );

コンパイル中に展開されます

int minVal2 = i < j ? 私:j;

したがって、min() を関数にする実行時のオーバーヘッドは取り除かれます。min() は、関数の宣言または定義で関数の戻り値の型の前に inline キーワードを指定することにより、インラインで宣言されます。

inline int min( int v1, int v2 ) { /* ... */ }

ただし、インライン指定はコンパイラへの推奨事項にすぎないことに注意してください。インラインで宣言された関数は呼び出し時点での展開に適していないため、コンパイラはこの推奨事項を無視することを選択する場合があります。たとえば、rgcd() などの再帰関数は、呼び出しの時点で完全に展開することはできません (最初の呼び出しは可能ですが)。1,200 行の関数も、呼び出し時に展開されない可能性があります。一般に、インライン メカニズムは、頻繁に呼び出される小さく直線的な関数を最適化することを目的としています。 これは、セクション 2.3 で導入された IntArray クラスの size() インライン メンバー関数など、抽象データ型の設計に隠されている情報をサポートする上で最も重要です。

誰かが太字でマークされた文を説明できますか?

4

3 に答える 3

1
  • 「抽象データ型の設計において、情報隠蔽を支援する上で大きな役割を果たしてきました」

データ型:この用語はおそらくご存知でしょう。整数、文字列など、または B ツリー、複素数などのより複雑な型にすることができます。

抽象データ型:これらは、実際のオブジェクトを表すデータ型です。

例えば

struct SCustomer
{
   string name;
   string address;
   int    id;
   enum CreditRanking { Good, Poor, Bankrupt };
   CreditRating rating;
};

CreditRatingSCustomerと同様に抽象データ型です。

情報の隠蔽:抽象データ型内に情報をカプセル化することにより、設計者は、SCustomer の実際の実装が思考プロセスを乱雑にすることなく、顧客に対して実行される操作について考えることができます。

情報は実際には隠されているわけではなく、必要に応じてデータ型の定義の中を見ることもできますが、多くの場合、細かいことは考えずに、高い (抽象的な) レベルに集中する方が簡単です。

次のように考えることができます。

  • 低レベルの詳細について考え、一連のオブジェクトを構築します。
  • 低レベルの詳細を無視して、オブジェクトをより大きなオブジェクトまたはアプリケーションに結合します。

上記は少し単純化しすぎていますが、趣を感じていただければ幸いです。

それは役に立ちますか?

于 2012-11-07T09:45:28.013 に答える
1

ここに第 3 版の全文はありませんが、投稿された文脈から、彼が何を言っているのかは明らかです。

一種の「ベクトル」クラスを想像してください。

class Vector {
private: 
  int * data; // pointer to data

ベクトル サイズへのアクセスを提供する方法はいくつかあります。

選択肢 1: public メンバー変数:

public:
  int datasize; 

選択肢 2: パブリック アクセサーを持つプライベート変数

private:
  int datasize; 

public:
  int getSize(); // body can be hidden in CPP, but would be { return datasize;};

選択肢 3: 2 として、ただしインライン アクセサーを使用する

private:
  int datasize; 

public:
  inline int getSize() { return datasize; };

さて、#1 はデータの隠蔽が不十分ですが、パフォーマンスは優れています。#2 は優れたデータ隠蔽機能を備えていますが、パフォーマンスは劣っています。#3 は優れたデータ隠蔽性を持ち、優れたパフォーマンスを発揮する可能性があります。(インラインは単なるヒントであることを忘れないでください)

私の見解では、#3 のデータ隠蔽は #2 よりもわずかに劣ります。なぜなら、たとえメンバーにアクセスできなくても、関数コードがヘッダーで明らかにされるからです。だから、私は彼の声明を次のように書き直します...

インライン関数は、データ隠蔽とパフォーマンスの要件の間で適切な妥協点を提供します。

コンパイラへの単なるヒントであるため、「最も重要」であることに同意しません。

于 2012-11-07T16:56:22.297 に答える
0

「インライン関数」の登場遅れについて。

インライン関数の呼び出しは、コードを「インライン」にするのと同じくらい高速です。一部のプログラマーは、速度とサイズのオーバーヘッドのためにロジックを関数にカプセル化することをためらうかもしれませんが、インライン関数を使用すると、オーバーヘッドが (通常は) わずかな量に最小限に抑えられます。

次のコードを考えてみてください。

int customer_code = get_code(customer_name);
int product_code  = get_id(product_name);
bool credit_ok    = check_credit(customer_code);
int order_number  = create_order(customer_code, credit_ok, 
                                 product_code, quantity);
print_order(order_number, customer_code, customer_name, 
            product_code, product_name, quantity);

情報隠蔽バージョンは次のようになります。

order ord = cust.make_order(product, quantity);
order.print();

このフォームをはるかに大きなプログラムの一部にすることで、高レベルのコードをはるかに理解しやすくすることができます。誰かが顧客、注文、製品などのオブジェクトを設計する必要がありますが、一度に 1 つのことに集中するだけでよく、プログラム全体でオブジェクトを使用できます。

于 2012-11-07T10:09:00.680 に答える