我想声明一个可以从多个 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]); }
在这种情况下,编译器可以在 file1中替换arr[0]
为。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 标准的工作解决方案。