静态数组常量是否会影响共享库布局?

时间:2008-10-03 14:22:25

标签: c++ dll linker const

考虑这两个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或GCC上 Visual C ++  在Mac或Linux上实际上将const数据放在只读页面上?也许我测试了错误的方法,但在英特尔的Mac上,const版本的元素似乎是可写的。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

虽然没有保证,但是在数组的情况下,const不太可能破坏二进制兼容性,因此共享库应该以相同的布局结束。

请注意,单个int

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

因为TEST是编译时常量。