0

C++ 同時実行プログラミングを学んでいる学生です。C++ プログラムを介してグラフィック カード チップとサウンド カード チップの両方の機能にアクセスする方法を知りたいです。OpenGL などの外部ライブラリを使用せずに、それぞれのドライバーとアプリケーションを接続する別の方法はありますか? OpenALなどのソリューションを例を挙げて簡単に説明していただけますか。ありがとうございました。

4

2 に答える 2

11
const int * const function_name(const int * point) const;
//(1)       (2)                 (3)                (4)

1 つ目は、返されたポインタが、関数によってアクセスされているデータを変更するために使用されるのを防ぎます。これは、共有データの予期しない変更を防ぐため、(変更したくない場合は) 良いことです。

2 つ目は、呼び出し元が返されたポインターを変更できないようにします。これは、組み込み型 (ポインターなど) を返す場合は効果がなく、クラス型を返す場合は、ムーブ セマンティクスが阻害されるため、不適切な場合があります。

3 番目は、関数がデータを変更するのを防ぎます。これは、最初と同じ理由で (適切な場合) 適切です。

4 番目は、関数がオブジェクトの (可変でない) 状態を変更するのを防ぎます。constこれは、オブジェクトで関数を呼び出すことができ、オブジェクトがいつ変更されるかを簡単に追跡できるため、(適切な場合)便利です。

const int * const Functiontwo(const int * const &) const;
//                                        (5)

ここで唯一新しいのは、ポインターをconst参照渡しすることです。そんなことをしても意味がありません。値による受け渡しは同じセマンティクスを提供し、冗長ではなく、おそらくより効率的です。const参照による受け渡しは、サイズが大きいかコピーにコストかかる型の場合、値による受け渡しよりも効率的です。

constわずかなバリエーションとして、値を渡します。

const int * const Functiontwo(const int * const) const;
//                                        (6)

これは、呼び出し元にとっては重要ではありません (実際、関数は、意味を変更することなく、それを使用してまたは使用せずに宣言できます)。したがって、それを宣言に置く意味はなく、定義に置くだけです。これは、ポインターが関数内で変更できないことを意味します。constこれは、関数の実装を追跡しやすくすることができるため、(ローカル変数の宣言と同様に) 良い場合があります。

于 2013-08-26T11:30:39.423 に答える
1

constメンバー関数の後は、関数が親オブジェクトの状態を変更しないことを意味します。

struct foo
{
    int bar() const; // does not modify the instance of foo
    int & bar(); // might modify the instance of foo
};

あなたの例では、関数は戻ります

int const * const

最初のconst手段は、int指している を変更してはならないということです。値を読み取ることはできるが、変更することはできないことをユーザーに伝えます。constこれは、正確性にも関連しています。

int const * foo() const; // can be used from const functions
int * foo(); // cannot be used from const function

2 番目constは、ポインター自体がconstであることを意味します。つまり、次のことを意味します。

int * ptr = &a;
*ptr = 42; // valid
ptr = &b; // valid

int const * ptr = &a;
*ptr = 42; // INVALID
ptr = &b; // valid

int * ptr const = &a;
*ptr = 42; // valid
ptr = &b; // INVALID

int const * ptr const = &a;
*ptr = 42; // INVALID
ptr = &b; // INVALID

const関数からの戻り値としてポインター自体を作成することは、ほとんど役に立ちません。

参考までに、C++03 のクイック ガイドは、オブジェクトを変更する場合は参照渡しを行い、変更を保持することです。オブジェクトを変更したいが、変更を保持したくない場合 (コピーが作成される)、または (例外!) 渡す値が POD タイプの場合は、値で渡します。POD 以外のタイプを変更する必要がない場合は、定数参照で渡し、コピー コストを節約します。

void foo(int & a); // changes to a are applied to a itself, no copy made
void foo(int a); // changes to a are applied to a copy of a, copy made
void foo(std::string const & a); // no changes allowed, no copy made
于 2013-08-26T11:42:39.253 に答える