Я хочу объявить постоянный массив, к которому можно получить доступ из нескольких файлов 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-файлах. Насколько мне известно, стандарт 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, для меня приемлемо.