Влияет ли постоянство статического массива на макет разделяемой библиотеки? - PullRequest
1 голос
/ 03 октября 2008

Рассмотрим эти два случая заголовка 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-содержимое на страницу только для чтения. Имеет ли Visual C ++ в Windows или GCC на Mac или Linux на самом деле размещать данные const на странице только для чтения? Возможно, я тестировал неправильно, но на Mac на Intel элементы const версии казались доступными для записи.

Ответы [ 3 ]

2 голосов
/ 03 октября 2008

Компилятор может помещать данные в другой раздел двоичного файла в зависимости от того, являются ли они постоянными или нет - это полностью на усмотрение компилятора.

1 голос
/ 03 октября 2008

Компилятор (или, собственно, компоновщик) может поместить секунду в сегмент, помеченный как доступный только для чтения, чтобы вызвать аппаратное исключение, если вы попытались записать в него. Поскольку запись в объекты, не предназначенные для записи, является вектором атак безопасности, все больше систем защищают свои данные только для чтения.

0 голосов
/ 03 октября 2008

Хотя нет никаких гарантий, const вряд ли нарушит двоичную совместимость в случае массива, поэтому совместно используемые библиотеки должны иметь одинаковую структуру.

Обратите внимание, что, вероятно, не будет иметь место для одного целого:

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

потому что TEST является константой времени компиляции.

...