考虑这两个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版本的元素似乎是可写的。
答案 0 :(得分:2)
编译器可能会将数据放入二进制文件的不同部分,具体取决于它是否为const - 这完全取决于编译器。
答案 1 :(得分:1)
编译器(或实际上,链接器)可以将第二个放入标记为只读的段中,以便在尝试写入时触发硬件异常。由于写入不打算写入的内容是安全攻击的载体,因此更多系统会保护其只读数据。
答案 2 :(得分:0)
虽然没有保证,但是在数组的情况下,const不太可能破坏二进制兼容性,因此共享库应该以相同的布局结束。
请注意,单个int
可能struct Test
{
static int const TEST;
};
int const Test::TEST = 7;
因为TEST是编译时常量。