静态数组的常数性会影响共享库的布局吗?
时间: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是一个编译时常量。
编译器(或者实际上是链接器)可以将第二个文件放入标记为只读的段中,以在尝试写入时触发硬件异常。由于写入不打算写入的内容是安全攻击的载体,因此更多的系统正在保护其只读数据。