5

私の知る限り、同じアクセス制御を持つ C++ 構造体/クラス メンバーは、宣言順にメモリに格納されます。次の例mであり、c次々に保存する必要があります。

#include <cstdlib>
#include <iostream>

struct X
{
    mutable int m;
    int         c;
};

const X cx = {0, 1};

int main()
{   
    X& x = const_cast<X&>(cx);

    x.m = rand();
    x.c = rand();

    std::cout<<x.m<<" "<<x.c;
}

この例では、プログラムが実行され、2 つの乱数が出力されます。読み取り専用で保護されたメモリに保存されているため、削除するmutableとクラッシュします。cx

これは私を驚かせました-1つのメンバーが全体の最適化をmutable無効にします(何らかの方法ですべてのメンバーを作成します)?conststructmutable

structa の一部を読み取り専用メモリに格納し、他の部分を非読み取り専用メモリに格納して、C++ 標準メモリ レイアウトを尊重することは可能ですか?

これは、Windows 7 で Visual Studio 2010 を使用し、Ubuntu で GCC 4.7.2 を使用してテストされました。

4

3 に答える 3

5

mutable標準では、多くの場所でメンバーについて説明しています。mutable以下に、オブジェクトのメンバーのみを変更できることを説明する標準の 3 つの部分を引用しconstます。それ以外の場合はUndefined Behaviorです。

3.9.3 CV修飾子 [basic.type.qualifier]

const オブジェクトは、型のオブジェクト、またはconst Tそのようなオブジェクトの可変でないサブオブジェクトです。

[...]

7.1.1 ストレージ クラス指定子 [dcl.stc]

クラス データ メンバーのmutable指定子は、それを含むクラス オブジェクトに適用された const 指定子を無効にしmutable、オブジェクトの残りの部分が であっても、クラス メンバーの変更を許可しますconst

[...]

7.1.6.1 cv 修飾子 [dcl.type.cv]

宣言されたクラス メンバー (7.1.1) を変更できることを除いて、オブジェクトの有効期間中 (3.8) にオブジェクトmutableを変更しようとすると、未定義の動作が発生します。const


structa の一部を読み取り専用メモリに格納し、他の部分を非読み取り専用メモリに格納して、C++ 標準メモリ レイアウトを尊重することは可能ですか?

いいえ、struct(またはclass) の一部をオブジェクトの残りの部分とは異なるメモリ領域に格納することはできません。

于 2013-09-03T07:41:10.063 に答える
1

キーワード「const」は、コンパイラ ディレクティブやコンパイラ ヒントではなく、「private」や「​​public」などのプログラマ チーム向けのラベルです。コンパイラはそれを最適化に使用できますが、その必要はありません。コンパイラは、悪用を制御して防止するだけで済みます。したがって、表示される動作はまったく問題ありません。いいえ、1 つの構造体インスタンスまたはクラス インスタンスの一部が異なるメモリ領域に存在することは不可能です (マッピングはカウントされません)。その決定は構造体の使用に影響を与えるため、プログラマーが許可する必要があります。

于 2013-09-03T07:22:02.023 に答える