У меня есть файл заголовка, содержащий множество небольших встроенных функций. У большинства из них есть постоянные данные. Поскольку эти функции критичны к производительности, важно то, как они обрабатывают константы. 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);
}