1

考虑以下两种 C++ 标头案例:

情况1:

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

案例二:

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

后一种情况下的 const 仅用于自我强加的编译时检查,还是会影响 Mac/Linux/Windows 上的共享库布局?

更新:根据答案,编译器可能会将 const 内容放在只读页面上。Windows 上的 Visual C++ 或 Mac 或 Linux 上的 GCC是否实际上将 const 数据放在只读页面上?也许我测试了错误的方式,但在英特尔的 Mac 上,const 版本的元素似乎是可写的。

4

3 回答 3

2

编译器可能会将数据放入二进制文件的不同部分,具体取决于它是否为 const - 这完全由编译器决定。

于 2008-10-03T14:31:08.833 回答
1

编译器(或者实际上是链接器)可以将第二个放入标记为只读的段中,以在您尝试写入时触发硬件异常。由于写入不打算写入的内容是安全攻击的载体,因此越来越多的系统正在保护其只读数据。

于 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 回答