这个问题在这里已有答案:
我有一个大数组uint8_t [95][5]
包含7x5位图各种字符(每个字节1位未使用)。我只使用这95个字符中的一些,但是完整的静态数组无论如何都存储在程序存储器中。
我正在使用AVR,它具有有限的程序存储器,因此每个字节都很重要!所以我尝试将数组重写为一些模板专用类(见下文),但它没有解决问题。当我导入包含所有定义的头文件时,所有字符都成为我的可执行文件的一部分,无论它们是否在程序中使用。
例如,以下代码
#include <stdint.h>
template <char C> struct BitMap { static uint8_t cols[5]; };
template <> uint8_t BitMap<'3'>::cols[] = {0xFF,0xFC,0xAB};
int main() { return 0; }
用g++ -Os
编译生成
main:
xor eax, eax
ret
BitMap<(char)51>::cols:
.byte -1
.byte -4
.byte -85
.zero 2
由于这个静态数组没有在程序中使用,有没有办法指示编译器/链接器摆脱它?或者,有没有我可以做的代码技巧,只有在我使用它时才能实例化数组?
一种方法可能是声明模板函数的特化,每个模板函数返回数据,并且不会编译未使用的内联函数;但这可能意味着数组是即时创建的。你可以将你的字符字体定义打包成int64,并使其成为纯代码吗?
您基本上描述了静态库链接的工作原理。
将对象作为单个模块放入静态库中。链接静态库。只有在代码中的某处引用了数组的符号时,模块才会被拉入可执行文件并成为可执行文件的一部分。
各种C ++链接器有时在解析静态库中定义的外部符号的数据引用时遇到问题。可能需要对链接器进行一些修补。