静态数组的常数性会影响共享库的布局吗?

时间:2020-03-06 15:04:39  来源:igfitidea点击:

考虑以下两种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上的Intel上,const版本的元素似乎可写。

解决方案

编译器可能会将数据放入二进制文件的不同部分,具体取决于数据是常量还是完全由编译器决定。

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

请注意,单个int可能不是这种情况:

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

因为TEST是一个编译时常量。

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