У меня есть заголовочный файл, содержащий множество небольших встроенных функций.У большинства из них постоянные данные.Поскольку эти функции являются критичными для производительности, важно то, как они обрабатывают константы.AFAIK Существует два способа обращения к константам:
1) Определите их в отдельном исходном файле, который позже будет связан с приложением.
2) Определить постоянные на месте.
Я бы выбрал последний способ, потому что он более удобен в обслуживании.Тем не менее, это может быть медленнее, если компилятор не оптимизирует тысячи одинаковых констант, которые создаются путем встраивания.
Вопрос:
Будет ли компилятор объединять этиравные постоянные?В частности, какой из следующих методов будет использоваться?
1) Объединение одинаковых констант в модуле компиляции.
2) Объединение одинаковых констант в модуле компоновки (целая программа или библиотека)
3) Объединение констант с любыми данными статических констант, которые имеют одинаковую битовую комбинацию и удовлетворяют требованиям выравнивания в модуле компиляции или во всей программе.
Я использую современный компилятор (GCC4.5).
Я не эксперт в ассемблере, поэтому я не мог ответить на этот вопрос сам, используя несколько простых тестов:)
РЕДАКТИРОВАТЬ:
Константы довольно большие (большинство из них не менее 16 байт), поэтому компилятор не может сделать их непосредственными значениями.
EDIT2:
ПРИМЕР кода
Этот использует постоянную на месте:
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);
}