Комбинирование констант в оптимизирующих компиляторах

У меня есть файл заголовка, содержащий множество небольших встроенных функций. У большинства из них есть постоянные данные. Поскольку эти функции критичны к производительности, важно то, как они обрабатывают константы. AFAIK есть два способа ссылаться на константы:

1) Определите их в отдельном исходном файле, который позже будет связан с приложением.

2) Определите константы на месте.

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

Вопрос:

Будет ли компилятор комбинировать эти равные константы? В частности, какой из следующих методов будет использован?

1) Объединение одинаковых констант в блоке компиляции.
2) Объединение одинаковых констант в связывающем модуле (целая программа или библиотека)
3) Комбинирование констант с любыми статическими данными констант, которые имеют одинаковый битовый шаблон и удовлетворяют требованиям выравнивания во всем блоке компиляции или всей программе.

Я использую современный компилятор (GCC4.5) .

Я не разбираюсь в ассемблере, поэтому сам не смог ответить на этот вопрос с помощью нескольких простых тестов :)

EDIT:

Константы довольно большие (большинство из них не менее 16 байт) , поэтому компилятор не может сделать их немедленными значениями.

РЕДАКТИРОВАТЬ2:

ПРИМЕР кода

Здесь используется постоянная на месте:

float_4 sign(float_4 a)
{
    const __attribute__((aligned(16))) float mask[4] = { //I use a macro for this line
        0x80000000, 0x80000000, 0x80000000, 0x80000000};
    const int128 mask = load(mask);
    return b_and(a, mask);
}
8
задан 15 February 2011 в 23:47
поделиться