2008-10-03 3 views
1

Рассмотрим эти два случая заголовка C++:Настраивает ли константа статического массива на раскладку общей библиотеки?

Case 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?

Update: Согласно ответам, компилятор может поставить константный материал на странице только для чтения. Does Visual C++ в Windows или GCC на Mac или Linux фактически размещают данные const на странице только для чтения? Возможно, я тестировал неправильный путь, но на Mac на Intel элементы const-версии казались доступными для записи.

ответ

2

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

0

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

Примечания это, скорее всего, не быть для одного ИНТА:

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

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

1

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