複数のコンパイル単位でメモリを複製せずに、複数の 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]); }
その場合、コンパイラは in file1 に置き換えることができarr[0]
ます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 標準で定義されている可視範囲には欠陥があると思います。そのため、C 標準に違反する Linux/gcc での実用的なソリューションは、私には受け入れられます。