1

次の2つのC++ヘッダーの場合を考えてみましょう。

ケース1:

class Test {
  public:
    static int TEST_DATA[];
};
int Test::TEST_DATA[] = { 1, 2, 3, 4 };

ケース2:

class Test {
  public:
    static int const TEST_DATA[];
};
int const Test::TEST_DATA[] = { 1, 2, 3, 4 };

後者の場合のconstは、自主的なコンパイル時チェックのみですか、それともMac / Linux / Windowsの共有ライブラリレイアウトに影響しますか?

更新:回答によると、コンパイラーconstのものを読み取り専用ページに配置する場合があります。WindowsのVisualC++またはMacまたはLinuxのGCCは、実際にconstデータを読み取り専用ページに配置しますかおそらく私は間違った方法でテストしましたが、IntelのMacでは、constバージョンの要素は書き込み可能であるように見えました。

4

3 に答える 3

2

コンパイラーは、データがconstであるかどうかに応じて、バイナリーの別のセクションにデータを配置する場合があります。これは、完全にコンパイラーの裁量によるものです。

于 2008-10-03T14:31:08.833 に答える
1

コンパイラ (または実際にはリンカー) は、読み取り専用としてマークされたセグメントに 2 番目を配置して、書き込みを試みた場合にハードウェア例外をトリガーすることができます。意図しないものへの書き込みはセキュリティ攻撃の媒介となるため、読み取り専用データを保護するシステムが増えています。

于 2008-10-03T16:15:42.883 に答える
0

保証はありませんが、const が配列の場合、バイナリ互換性を損なう可能性は低いため、共有ライブラリは同じレイアウトになるはずです。

これは、単一の int には当てはまらない可能性が高いことに注意してください。

struct Test
{
    static int const TEST;
};
int const Test::TEST = 7;

TEST はコンパイル時の定数であるためです。

于 2008-10-03T15:03:36.803 に答える