Встраиваемый постоянный массив C без дублирования памяти

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

13
задан pb2q 9 July 2012 в 21:58
поделиться