0

我有一个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

由于程序中没有使用这个静态数组,有没有办法指示编译器/链接器摆脱它?或者,我可以做任何代码技巧,以便只有在我使用它时才实例化数组?

4

2 回答 2

1

您基本上已经描述了静态库链接的工作原理。

将对象作为单个模块放入静态库中。与静态库链接。该模块将被拉入可执行文件,并成为可执行文件的一部分,前提是该数组的符号在代码中的某处被引用。

各种 C++ 链接器有时会在解析对静态库中定义的外部符号的纯数据引用时遇到问题。可能需要对链接器进行一些修改。

于 2019-03-19T10:47:18.820 回答
1

一种方法可能是声明模板函数的特化,每个函数都返回数据,并且未使用的内联函数不会被编译;但这可能意味着数组是动态创建的。你能把你的字体定义打包成一个 int64,并使它成为纯代码吗?

于 2019-03-19T11:06:25.180 回答