0

コード全体で構造を使用するCのコードがあります。私は主にmemsetまたはmemcpyを使用して、バッファとの間でデータをコピーします。

これがC++で動作するか知りたいですか?'MSDNによる:

C ++では、構造はクラスと同じですが、そのメンバーがデフォルトでパブリックである点が異なります。

つまり、C ++コンパイラは内部構造体オブジェクトに内部を挿入し、memsetまたはmemcpyはCのように機能しません。

また、「this」ポインタは構造体にも適用できますか?コンパイラがC ++のようなものをオブジェクトに挿入するのを防ぐ方法はありますか?

4

4 に答える 4

3

memcpy構造体がC++構造体(仮想化など)を使用しておらず、C++でも機能する限りmemset

また、「this」ポインタは構造に適用できますか?
はい、thisポインタはクラスの場合と同じように構造に適用できます。

コンパイラがC++のようなものをオブジェクトに挿入するのを防ぐ方法はありますか?
構造体にC++構造体を使用しない限り、コンパイラーは使用しません。

于 2012-05-14T06:00:35.480 に答える
1

あなたの(または)が通常のデータ型またはそれらからなる構造/クラスのみを含み、重要なc'tors / d'tors(コンストラクター/デストラクタ)を含まない限り、自由に使用できますmemXXXXstructclass

偶数の事実はこれであるclassか、またはstruct-は関係ありません。

于 2012-05-14T05:59:49.990 に答える
0

コード全体で構造を使用するCのコードがいくつかあります。私は主にmemsetまたはmemcpyを使用して、バッファとの間でデータをコピーします。

これがC++で動作するか知りたいですか?'MSDNによる:

C ++では、構造はクラスと同じですが、そのメンバーがデフォルトでパブリックである点が異なります。

はい-MSDNは正しいですが、C ++のコピーがCのclassコピーと同じくらい安全であることを意味するのstructではなく、構造体がクラスと同じくらい複雑になる可能性があり、どちらも一般的に安全ではありません。構築されたオブジェクトを適切にデフォルト/コピーしてmemset/memcpy操作を破棄するように移動することを確実に好む必要があります。memsetとは限られた場合にmemcpy機能しますが(基本的に、class/structとそのすべてのベースにCで機能するものだけが含まれている場合)仮想ディスパッチテーブルへのポインタはmemsetによって適切に設定されませんが、memcpy-すべての実装定義)であり、不変条件を維持しようとはしません。実際には、クラスには不変条件があるか、コード/データの自己管理型のカプセル化単位になるにつれてそれらが導入されることがよくあります。コンストラクターは、一部のデータメンバーが関連する一貫した期待値を持っていることを確認できます-これらの不変条件が真に保たれることなく-そしてmemsetはそれらの最も単純なものを除いてすべてを無効にする可能性があります-クラスは後で未定義の動作を示す可能性があります。

また、「this」ポインタは構造体にも適用できますか?コンパイラがC ++のようなものをオブジェクトに挿入するのを防ぐ方法はありますか?

はい-繰り返しstructますが、C ++のaは-と同じ種類のエンティティですclass-唯一の違いは、メンバー関数とデータの可視性/アクセシビリティにあります。どちらにもthisポインタがあります。ただし、このポインターはクラス/構造体には格納されません。これらは、メンバー関数の呼び出しに暗黙的に提供されるそのようなオブジェクトへのポインターです。memcpy(ab)usingとのコンテキストでこれについて心配する必要はありませんmemset。より一般的には、C ++固有のことについて心配する必要があるのvirtualは、無効化される可能性のある関数とクラス不変条件だけです。あなたはまだCの問題について心配する必要があります:memcpy同じリソース(ファイル記述子、ヒープへのポインター、ロックなど)を使用して複数のオブジェクトを作成します。両方のオブジェクトは、そのリソースを排他的に制御していると想定し、後でリソースを削除/解放/解放しようとします。

于 2012-05-14T09:12:15.463 に答える
0

つまり、C++コンパイラは内部構造体を構造体オブジェクトに挿入します

いいえ、そうではありません。

memsetまたはmemcpyはCのようには機能しません。

それもそういう意味ではありません。

あなたの推測は完全に動機付けられておらず、あなたの質問は不明確なままです。

于 2012-05-14T09:41:28.680 に答える