Я хочу объявить постоянный массив, к которому можно получить доступ из нескольких файлов C и чей контент может быть встроен компилятором, без дублирования памяти в нескольких единицах компиляции. Производительность очень важна в моем приложении.
Иллюстрация 1:
header.h:
static const int arr[2] = { 1, 2 };
file1.c:
#include "header.h"
void file1() { printf("%d\n", arr[0]); }
file2.c:
#include "header.h"
int file2() { for (int i = 0; i < 2; i++) printf("%d\n", arr[i]); }
В этом случае компилятор может заменить arr[0]
на 1
в файле1. Однако, поскольку arr
объявлен static const
, его память дублируется в обоих файлах C. AFAIK для стандарта C требует, чтобы адреса массивов были разными в обоих файлах. Я проверил это под Linux, распечатав адреса. Консолидация компоновщика не происходит даже при -fmerge-all-constants
в gcc.
Иллюстрация 2:
header.h:
extern const int arr[2];
file1.c:
#include "header.h"
void file1() { printf("%d\n", arr[0]); }
file2.c:
#include "header.h"
const int arr[2] = { 1, 2 };
int file2() { for (int i = 0; i < 2; i++) printf("%d\n", arr[i]); }
В этом случае дублирование памяти не происходит, но arr[0]
не встроен.
Я считаю, что область видимости, определенная стандартом C, является ошибочной. Таким образом, для меня приемлемо рабочее решение под Linux/gcc, которое нарушает стандарт C.